2012-02-07 42 views
8

Kịch bản lệnh thông minh sau khớp với các lát của hai mảng. Lúc đầu, cả hai mảng đều giống nhau và tôi nhận được kết quả hợp lý. Sau đó, tôi thay đổi một trong những mảng và thông minh phù hợp với hai lát mới, nhưng nó vẫn nói rằng các lát là giống hệt nhau. Tuy nhiên, khi tôi sao chép các lát vào mảng, thông minh phù hợp với các mảng cho thấy rằng chúng thực sự khác nhau.Tại sao smartmatch trả về true khi so sánh các mảng mảng khác nhau?

Kịch bản:

#!/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"; 

Sản lượng:

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 

Tôi đang sử dụng Perl 5.10.1, và điều này xảy ra cho cả hai mảng lát và băm lát. Lý do tại sao điều này xảy ra?

+1

Bạn đang sử dụng phiên bản Perl nào? Với 'v5.14.2' tôi nhận' bằng', 'bằng' và' không bằng', 'không bằng'. – flesk

Trả lời

5

Hình như phù hợp với thông minh làm việc trong bối cảnh vô hướng với lát.

Hãy xem xét các mảnh mã sau:

trường hợp của bạn:

#!/usr/bin/perl 

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

Đó có thể là những gì bạn cần:

#!/usr/bin/perl 

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

Đúng vậy! Bây giờ nó hoạt động như tôi đã muốn. Cảm ơn! – askucins

3

Toán tử khớp thông minh ~~ thực hiện phép thuật cho mảng, chứ không phải cho danh sách. Một mảng mảng là một danh sách, không phải là một mảng.

Cập nhật:

Bạn có thể giải quyết nó chỉ bằng cách kèm theo lát của bạn vào khung, kể từ trận đấu thông minh tự động dereferences:

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

"Một mảng mảng là một danh sách, không phải là một mảng." - gì?! – JackTheRandom

+0

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

0

Originally posted by askucins

Tôi chạy một qui ck truy vấn trong các tài liệu Perl liên quan đến các hành vi khác nhau của thử nghiệm đó so với phiên bản Perl và tôi thấy rằng điều này đã được cố định trong Perl 5.13.5. Xem "phù hợp thông minh chống lại mảng lát" trong perl5135delta:

Trước đây, các mã sau đây dẫn đến một trận đấu thành công:

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

hành vi kỳ lạ này hiện đã được cố định [perl #77468].

Các vấn đề liên quan