+ -
当前位置:首页 → 问答吧 → Perl 数组问题

Perl 数组问题

时间:2010-12-23

来源:互联网

Perl code
use warnings;
use strict;

my @list = ("123","124","125");

foreach(@list)
{
    print $_,"\n";
}

my $temp;
foreach $temp(@list)
{
    $temp =~ s/2/a/g;#HERE!!
}

foreach(@list)
{
    print $_,"\n";
}

my $i= 0;
my $var;
for($i=0; $i<scalar(@list); $i++)
{
    $var = $list[$i];
    $var =~ s/1/r/g;#HERE!!
}

foreach(@list)
{
    print $_,"\n";
}


如代码所示,第一次替换后,怎么会改变了数组的内容?
按第二种方法就没有改变数组。

作者: wxgiter   发布时间: 2010-12-23

在一个foreach循环中,迭代器并不只是设置为数据(或称为列表)中的每个元素的值,它实际上是对数组的元素的引用。因此,在上面这个foreach循环中,如果修改该循环中的$temp,就能修改@list中的对应元素。
而后面的例子,你用$var中转了数据元素的值,显然就不再是对数组进行引用,而只是值的传递。

作者: havent_bao   发布时间: 2010-12-23

另外,我的习惯是,不论会不会改变这个值。我是不会直接对这个值进行修改。如果想改,我直接去改数组元素,如果不想改,就用变量去传递值。这样既容易读,也不易错。

作者: havent_bao   发布时间: 2010-12-23

foreach循环的控制变量($temp)不是列表元素的备份,它本身就逐次代表列表的元素本身,循环时如果修改了变量,原始的列表元素就会被修改。

作者: sunming2008   发布时间: 2010-12-23

第二种方法,已经把数组元素copy到$var里了。当然不会修改原来的值。
第一种方法, foreach xxx ;这里的xxx应该是数组每个元素的一个ref

作者: Aylazhang   发布时间: 2010-12-23