Arrays vergleichen

Arrays vergleichen

am 17.07.2006 21:31:41 von Torsten Mohr

Hallo,

ich möchte zwei Arrays auf Gleichheit überprüfen, @A == @B konvertiert
die Arrays anscheinend erst zu Skalaren.

@A == (1, 2, 4) scheint das zu tun was ich will, allerdings verstehe ich
die Warnung nicht (Useless use of a constant in void context).

Arrays sind in perldoc perlop bei den relationalen Operatoren nicht
erwähnt, wie ist das mit Arrays, wie vergleicht man die? Und wie ist
das bei Hashes, kann man das darauf auch anwenden?


Grüße,
Torsten.


Hier ein Testprogramm:

#! /usr/bin/perl -w

my @A = (1, 2, 3);
my @B = (1, 2, 4);

if(@A == @B) {
print "True\n"; # Hier
}
else {
print "False\n";
}

if(@A == (1, 2, 4)) { # Useless use of a constant in void context
print "True\n";
}
else {
print "False\n"; # Hier
}

if(@A == (1, 2, 3)) { # Useless use of a constant in void context
print "True\n"; # Hier
}
else {
print "False\n";
}

Re: Arrays vergleichen

am 17.07.2006 21:59:24 von Wolf Behrenhoff

Torsten Mohr schrieb:
> Hallo,
>
> ich möchte zwei Arrays auf Gleichheit überprüfen, @A == @B konvertiert
> die Arrays anscheinend erst zu Skalaren.

@array in skalarem Kontext gibt die Anzahl der Elemente zurück. Somit
vergleichst du, ob @A und @B gleich lang sind.

> @A == (1, 2, 4) scheint das zu tun was ich will, allerdings verstehe ich
> die Warnung nicht (Useless use of a constant in void context).

Nein, es tut etwas anderes. Es vergleicht @A mit 4 (der letzten
Konstanten) und hat dann die Konstanten 1 und 2 in leerem Kontext. Somit
wird hier getestet, ob @A vier Elemente lang ist.

Schön kannst du das sehen, wenn du perl -MO=Deparse benutzt.

> Arrays sind in perldoc perlop bei den relationalen Operatoren nicht
> erwähnt, wie ist das mit Arrays, wie vergleicht man die? Und wie ist
> das bei Hashes, kann man das darauf auch anwenden?

Elementweise.

Wolf

Re: Arrays vergleichen

am 17.07.2006 22:43:45 von Torsten Mohr

Hallo,

danke für die Tips.

> @array in skalarem Kontext gibt die Anzahl der Elemente zurück. Somit
> vergleichst du, ob @A und @B gleich lang sind.

Ja, das hatte ich auch so vermutet.

>> @A == (1, 2, 4) scheint das zu tun was ich will, allerdings verstehe ich
>> die Warnung nicht (Useless use of a constant in void context).
>
> Nein, es tut etwas anderes. Es vergleicht @A mit 4 (der letzten
> Konstanten) und hat dann die Konstanten 1 und 2 in leerem Kontext. Somit
> wird hier getestet, ob @A vier Elemente lang ist.

Das hatte ich so nicht vermutet, das erklärt das Verhalten.

> Schön kannst du das sehen, wenn du perl -MO=Deparse benutzt.

Danke für den Tip, das sieht hilfreich aus.


Grüße,
Torsten.