2008-10-06 6 views

Antwort

36

=:=-Tests, wenn zwei Behälter (Variablen oder Elemente von Arrays oder Hashes) aliased sind, das heißt, wenn man ändert, ändert sich die andere Veränderung als auch?

my $x; 
my @a = 1, 2, 3; 
# $x =:= @a[0] is false 
$x := @a[0]; 
# now $x == 1, and $x =:= @a[0] is true 
$x = 4; 
# now @a is 4, 2, 3 

Wie für die anderen: === prüft, ob zwei Verweise auf das gleiche Objekt zeigen und eqv-Tests, wenn zwei Dinge sind strukturell gleichwertig. So wird [1, 2, 3] === [1, 2, 3] falsch sein (nicht das gleiche Array), aber [1, 2, 3] eqv [1, 2, 3] wird wahr sein (gleiche Struktur).

leg vergleicht Strings wie Perl 5 ist cmp, während Perl 6 ist cmp schlauer ist und werden Zahlen wie <=> und Strings wie leg vergleichen.

13 leg 4 # -1, because 1 is smaller than 4, and leg converts to string 
13 cmp 4 # +1, because both are numbers, so use numeric comparison. 

Schließlich ~~ ist das "smart match", es beantwortet die Frage "tut $x Spiel $y". Wenn $y ein Typ ist, wird der Typ überprüft. Wenn $y eine Regex ist, ist es Regex-Übereinstimmung - und so weiter.

+1

Perl 5 hat kein 'eqv'. Ich denke, du meintest 'CMP' dort. – cjm

17
+0

Danke, aber ich verstehe immer noch nicht was =: = tut. Und was ist der Unterschied zwischen leg und cmp? – raldi

+0

Soweit ich weiß, ist =: = nur wichtig, wenn Sie Aliase zugewiesen haben. Laut http://perlgeek.de/blog-en/perl-5-to-6/cmp wurde nun in leg umbenannt, also sollten sie gleich sein. – Randy

+0

Die sind nicht die gleichen (und ich hoffe, ich habe es nicht so auf diesem Blog gesagt), cmp ist "schlauer" als Bein. – moritz

12

Kann die Zusammenfassung in Synopsis 3: Comparison semantics tun, was Sie wollen, oder haben Sie das schon gelesen? Die Entwurfsdokumente verweisen auf die Testdateien, in denen diese Funktionen verwendet werden, sodass Sie Beispiele für ihre Verwendung und ihren aktuellen Teststatus sehen können.

Die Vergleichsoperatoren von Perl 6 sind viel besser geeignet für eine dynamische Sprache und all die Dinge, die vor sich gehen. Statt nur Strings oder Zahlen zu vergleichen (oder Dinge in Strings oder Zahlen zu verwandeln), können Sie jetzt Dinge genau mit einem Operator testen, der das tut, was Sie wollen. Sie können den Wert, den Container, den Typ usw. testen. In einem der Kommentare fragen Sie nach eqv und cmp. In den alten Tagen von Perl 5 war cmp dort zum Sortieren und gibt einen von drei magischen Werten (-1,0,1) zurück, und das tat er immer mit Zeichensemantik. In Perl 6 gibt cmp einen von drei Typen von Order-Objekten zurück, sodass Sie sich nicht merken müssen, was -1, 0 oder 1 bedeutet. Auch die neue cmp erzwingt keine Zeichenfolge Semantik, so dass es intelligenter sein kann, wenn Zahlen (im Gegensatz zu Perl 5, die sortieren würde wie 1, 10, 11, 2, 20, 21 ...).

Die leg (l ess als, e Qual, g rößere als) ist cmp mit String-Semantik. Es ist definiert als Perl 6's ~$a cmp ~$b, wobei ~ der neue "string contextualizer" ist, der String-Semantik erzwingt. Mit leg machen Sie immer einen String-Vergleich, genau wie die alte Perl 5 cmp.

Wenn Sie noch Fragen zu den anderen Operatoren haben, teilen wir sie in separate Fragen auf. :)

+0

Siehe auch http://docs.perl6.org/ - Sie können dort die einzelnen Operatoren suchen. – Coke

2

Dies ist auch ein praktisches Nachschlagewerk:

Perl6 Periodic Table of Operators

+1

Dieser Druck, obwohl schön, ist nicht auf dem neuesten Stand mit der aktuellen Version der Spezifikation, Perl 6.c – Coke

+0

@Coke gut, das * wurde * im Jahr 2010 geschrieben, aber der Beantworter ist immer noch ein aktiver Benutzer, also wünsche ich ihnen 'd update es – cat

+0

@tac die Antwort ist markiert "Gemeinschaft Wiki", so dass jeder es bearbeiten kann. Oder Sie könnten in einem Kommentar klären, welches Update Sie erwarten. – Ether