次のスクリプトは、2つの配列のスライスをスマートマッチします。最初は、両方のアレイが同じであり、妥当な結果が得られています。次に、配列の1つを変更し、2つの新しいスライスをスマートマッチングしますが、それでもスライスは同一であると表示されます。ただし、スライスを配列にコピーすると、配列をスマートマッチングすると、実際には異なることがわかります。
スクリプト:
#!/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";
出力:
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
私はPerl5.10.1を使用していますが、これは配列スライスとハッシュスライスの両方で発生します。なぜこれが起こるのですか?