2012-02-07 6 views
8

Poniższy skrypt inteligentnie dopasowuje plasterki dwóch tablic. Na początku obie tablice są takie same i uzyskuję rozsądne wyniki. Następnie zmieniam jedną z tablic i dopasowuję dwa nowe plasterki, ale wciąż jest napisane, że plasterki są identyczne. Jednakże, kiedy kopiuję plasterki na tablice, inteligentne dopasowanie tablic pokazuje, że są one rzeczywiście różne.Dlaczego funkcja smartmatch zwraca wartość true, porównując wycinki tablic, które powinny być różne?

Skrypt:

#!/usr/bin/perl 
use warnings; 
use strict; 
use diagnostics; 

my @x = qw (one two); 
my @y = qw (one two); 
my @x_s; 
my @y_s; 

print "Before change: values are the same:\n"; 
@x_s = @x[0,1]; 
@y_s = @y[0,1]; 
print "\@x_s: @x_s\n"; 
print +(@x[0,1] ~~ @y[0,1]) ? "equal\n" : "not equal\n"; 
print +(@x_s ~~ @y_s) ? "equal\n" : "not equal\n"; 

$x[0]='three'; 

print "After change: values should be different:\n"; 
@x_s = @x[0,1]; 
@y_s = @y[0,1]; 
print "\@x_s: @x_s\n"; 
print +(@x[0,1] ~~ @y[0,1]) ? "equal\n" : "not equal\n"; 
print +(@x_s ~~ @y_s) ? "equal\n" : "not equal\n"; 

Wyjście:

Before change: values are the same: 
@x_s: one two 
equal 
equal 
After change: values should be different: 
@x_s: three two 
equal 
not equal 

Używam Perl 5.10.1, a to dzieje się na obu tablicy plasterki i plasterki cebulą. Dlaczego to się dzieje?

+1

Którą wersję Perla używasz? W 'v5.14.2' otrzymuję' equal', 'equal' oraz' not equal', 'not equal'. – flesk

Odpowiedz

5

Wygląda Smart Matching działa w kontekście skalarnym z plasterków.

Rozważmy następujące fragmenty kodu:

Twoja sprawa:

#!/usr/bin/perl 

my @foo = (1,2); 
my @bar = (3,4); 
print @foo[1,2] ~~ @bar[1,2] ? "Equal\n" : "Not equal\n"; 

To chyba to, czego potrzebujesz:

#!/usr/bin/perl 

my @foo = (1,2); 
my @bar = (3,4); 
print [ @foo[1,2] ] ~~ [ @bar[1,2] ] ? "Equal\n" : "Not equal\n"; 
+0

To wszystko! Teraz działa tak, jak chciałem. Dzięki! – askucins

3

Operator inteligentnego dopasowania ~~ ma swoją magię dla tablic, a nie dla list. Fragment tablicy to lista, a nie tablica.

Aktualizacja:

Można go rozwiązać tylko przez załączając swoje plastry w nawiasach, ponieważ mądry mecz automatycznie dereferences:

print +([@x[0,1]] ~~ [@y[0,1]]) ? "equal\n" : "not equal\n"; 
+0

"Wycinek tablicy to lista, a nie tablica." - co?! – JackTheRandom

+0

@JacktheRandom: https://www.socialtext.net/perl5/array_vs_list – choroba

0

Pierwotnie wysłane przez askucins

wpadłem qui ck zapytanie w dokumentach Perla związane z innym zachowaniem tego testu w porównaniu z wersją Perla i stwierdziłem, że zostało to naprawione w Perlu 5.13.5. Patrz „Smart Matching przed plasterków tablicy” w perl5135delta:

Wcześniej następujący kod zaowocować udanym meczu:

my @a = qw(a y0 z); 
my @b = qw(a x0 z); 
@a[0 .. $#b] ~~ @b; 

To dziwne zachowanie został ustalony [perl #77468].

Powiązane problemy