2016-07-01 6 views
2

Hier ist mein Testcode:Warum empfängt mein Perl Sub die Parameter seines Elternteils?

Result from array_minus + sort : 2 
Can't use string ("b") as an ARRAY ref while "strict refs" in use at Array/Utils.pm line 123. 

So, der zweite Aufruf von array_minus nicht wegen falscher Parameter:

#!/bin/perl 
use strict; 
use Array::Utils qw[array_minus]; 

sub sub1 { 
    my @array1 = qw(1 2 3); 
    my @array2 = qw(1 3 5); 
    my @arrayMinus = array_minus(@array1, @array2); 
    my @sortedArrayMinus = sort @arrayMinus; 
    print "Result from array_minus + sort : " . join(",", @sortedArrayMinus) . "\n"; 
    my @sortedArrayMinus2 = sort array_minus(@array1, @array2); 
    print "Result from sort array_minus : " . join(",", @sortedArrayMinus2) . "\n"; 
} 

sub1("a","b"); 

Wenn ich es laufen, es folgendes Ergebnis gibt.

Ich bin mit Version 0.5 des Array :: Utils Bibliothek (ich es manuell kopiert haben von http://cpansearch.perl.org/src/ZMIJ/Array-Utils-0.5/Utils.pm) Die entsprechenden Zeilen dieser Datei sind:

sub array_minus(\@\@) { 
    my %e = map{ $_ => undef } @{$_[1]}; 
    return grep(! exists($e{$_}), @{$_[0]}); 
} 

Wenn ich den Wert debuggen @ _ in array_minus ist der Wert für den ersten Aufruf OK, für den zweiten Aufruf jedoch ['a', 'b'].

So verhält es sich, als ob array_minus sub die Parameter von sub1 empfängt, anstelle von denen, die ich übergeben habe, aber nur wenn ich auch frage, das Ergebnis in derselben Zeile zu sortieren. Was ist falsch in meinem Code? Ich benutze Perl 5.22.1.

+0

Sie initialisieren Arrays, die nur Zahlen enthalten, die Strings verwenden. Nicht unbedingt falsch * per se * aber seltsam. Außerdem verwendet plain sort String-Vergleiche, die nicht numerisch sind, so dass '@x = (11, 1, 7)' 'als '1, 11, 7' sortiert wird - was möglicherweise nicht das ist, was Sie wollen. –

Antwort

7

die Warnung in sort Lese und die Syntax beheben:

my @sortedArrayMinus2 = sort(array_minus(@array1, @array2)); 

Die ursprüngliche Syntax sort erzählt array_minus als die Vergleichsfunktion zu verwenden.

+0

Links ungesagt ist die Tatsache, dass 'sort' allein String-Vergleiche verwendet, obwohl die Arrays Nummern zu enthalten scheinen, die aus irgendeinem Grund als Strings initialisiert werden. –

9

Dieser Ausdruck:

sort array_minus(@array1, @array2) 

wirklich bedeutet "die Liste sortiert aus resultierenden @array1 und @array2 verketten, mit array_minus als die Vergleichsfunktion".

Wie in perldoc -f sort:

Warnung: syntaktische Sorgfalt erforderlich, wenn die Liste von einer Funktion zurückgegeben Sortierung. Wenn Sie die Liste zurückgegeben durch den Funktionsaufruf find_records(@key) sortieren möchten, können Sie verwenden:

my @contact = sort { $a cmp $b } find_records @key; 
    my @contact = sort +find_records(@key); 
    my @contact = sort &find_records(@key); 
    my @contact = sort(find_records(@key)); 

... denn sonst bist du die sort SUBNAME LIST Syntax schlagen (die aus historischen Gründen existiert: hatte perl sort lange bevor es Subroutinenreferenzen unterstützte).

Verwandte Themen