2016-11-02 2 views
1

versuche abzubilden ein Array an ein Unterprogramm übernimmt das 2 Argument akzeptieren, habe ich versucht, php array_map concept verwenden, aber funktionieren nicht:maping zu einem Unterprogramm, das mehrere Argument

sub m { 
    my ($n, $m) = @_; 
    return("The number $n is called $m in Spanish"); 
} 

sub new_map { 
    my (@argument) = @_; 
    my @arg = @argument; 

    @array = map(m($_, $_), @{ $arg[0] }, @{ $arg[1]}); 
} 

my @arr1 = (1, 2, 3); 
my @arr2 = ("uno", "dos"); 
new_map(\@arr1, \@arr2); 

#outputs 
#The number 1 is called 1 in Spanish INSTEAD OF 'The number 1 is called uno in Spanish' 
#The number 2 is called 2 in Spanish INSTEAD OF 'The number 1 is called dos in Spanish' 

Gibt es eine Möglichkeit, dies zu erreichen .

Antwort

6

Ihre aktualisierte Code, der verwendet new_map wie so getan werden könnte:

use Algorithm::Loops 'MapCarMin'; 

my @arr1 = (1, 2, 3); 
my @arr2 = ("uno", "dos"); 
@array = MapCarMin \&m, \@arr1, \@arr2; 

oder

sub call_m_over_pair_of_arrays { 
    my ($arrayref1, $arrayref2) = @_; 
    map &m($arrayref1->[$_], $arrayref2->[$_]), 0..($#$arrayref1 < $#$arrayref2 ? $#$arrayref1 : $#$arrayref2); 
} 
@array = call_m_over_pair_of_arrays(\@arr1, \@arr2); 

Antwort ursprüngliche Frage:

Klammerung Listen oder Arrays nicht in Perl erstellen ; Verschachtelte Klammern werden einfach in eine einzige Liste geglättet; Sie müssten dies tun:

@array = map(&m(@$_), [ 1, 'uno' ], [ 2, 'dos' ]); 

Oder diese:

use List::Util 1.29 'pairmap'; 
@array = pairmap { &m($a, $b) } (1, 'uno', 2, 'dos'); 

nicht Subroutinen Namen m; das kollidiert, wenn der m Match-Operator. (Obwohl Sie immer noch eine solche Subroutine mit & aufrufen können, ist es besser, nicht.)

+0

Sorry, ich habe meine Frage bearbeitet. Ich habe mein Array durch ref übergeben so mit der ersten Lösung ging du hast ich diesen Fehler bekommen 'Kann nicht String (" 1 ") als ARRAY ref verwenden, während" strict refs "' –

+0

Ich würde sehen müssen, was Sie getan haben weiß, wo du falsch gelaufen bist. Aktualisierung meiner Antwort – ysth

+0

richtig, jede andere Möglichkeit, es zu tun, ohne 'Algorithm :: Loops 'MapCarMin';' –

Verwandte Themen