perl foreach和sort一起使用foreach怎么影响到原来的list?
@this = qw/1 2 4 3 7 9 8 5/;
foreach (sort @this){
$_ = 1;
}
print "@this\n";
得到的结果是
1 1 1 1 1 1 1 1
sort返回新的list但不影响原来的list
我以为是先sort返回一个list 然后foreach在这个返回的list上工作 所以改变的应该是返回的list而不是原来的this 但是看到结果貌似不是这样的....请问具体的工作原理是怎样的?
谢谢 展开
挺有意思的一个问题,以前还没注意过。我查了一下perldoc,有一段话:
"sort() returns aliases into the original list, much as a for loop's index variable aliases the list elements. That is, modifying an element of a list returned by sort() (for example, in a foreach, map or grep) actually modifies the element in the original list. This is usually something to be avoided when writing clear code."
也就是说在foreach, map or grep中,这样的用法是一种引用,会修改原始数组数据。
但是测试以后发现,如果只是简单赋值@a=sort @b,就把引用变成copy了,就没有上述效果。感觉似乎还是有点疑问,不管怎么说,文档也建议不要这么用。
写了一段测试代码,印证一下:
#!/usr/bin/perl
@this = ( "2", "1", "3" );
print "before:@this\n";
@that=map {$_+=1} sort @this;
print "after:@this\n";
print "that:@that\n";
输出:
before:2 1 3
after:3 2 4
that:2 3 4