8

以下脚本智能匹配两个数组的切片。一开始,两个数组都是相同的,我得到了合理的结果。然后我更改其中一个数组并智能匹配两个新切片,但它仍然说切片是相同的。但是,当我将切片复制到数组中时,智能匹配数组表明它们确实不同。

剧本:

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

我正在使用 Perl 5.10.1,这发生在数组切片和哈希切片上。为什么会这样?

4

3 回答 3

5

看起来智能匹配在带有切片的标量上下文中工作。

考虑以下代码片段:

你的情况:

#!/usr/bin/perl

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

这可能就是你需要的:

#!/usr/bin/perl

my @foo = (1,2);
my @bar = (3,4);
print [ @foo[1,2] ] ~~ [ @bar[1,2] ] ? "Equal\n" : "Not equal\n";
于 2012-02-07T12:34:25.670 回答
3

智能匹配运算符~~对数组而不是列表发挥魔力。数组切片是一个列表,而不是数组。

更新:

您可以通过将切片括在括号中来解决它,因为智能匹配会自动取消引用:

print +([@x[0,1]] ~~ [@y[0,1]]) ? "equal\n" : "not equal\n";
于 2012-02-07T12:29:49.810 回答
0

最初由ascucins 发表

我在 Perl 文档中运行了一个与该测试与 Perl 版本的不同行为相关的快速查询,我发现这在 Perl 5.13.5 中已修复。请参阅perl5135delta中的“针对数组切片的智能匹配” :

以前,以下代码导致匹配成功:

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

这种奇怪的行为现在已得到修复 [ perl #77468 ]。

于 2016-09-20T22:25:47.493 回答