perl foreach和sort一起使用foreach怎么影响到原来的list?

比如@this=qw/12437985/;foreach(sort@this){$_=1;}print"@this\n";得到的结果是11111111sort返回新的li... 比如
@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 但是看到结果貌似不是这样的....请问具体的工作原理是怎样的?
谢谢
展开
 我来答
tlint
推荐于2016-08-16 · TA获得超过201个赞
知道小有建树答主
回答量:174
采纳率:0%
帮助的人:79.2万
展开全部

挺有意思的一个问题,以前还没注意过。我查了一下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

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式