foreach my $ var(@list) - $ var是一个参考?

Rya*_*zel 8 perl foreach perlsyn

所以,我从来不知道这一点,我希望得到一些澄清.我知道你是否这样做

foreach (@list){
Run Code Online (Sandbox Code Playgroud)

如果在该循环中更改$ _,则会影响实际数据.但是,如果你这样做,我不知道

foreach my $var1 (@list){
Run Code Online (Sandbox Code Playgroud)

如果您在循环中更改了$ var1,它将更改实际数据.: - /那么,有没有办法循环@list但保持变量是只读副本,或者如果更改的副本不会更改@list中的值?

Sin*_*nür 10

$var 依次对每个项目别名.

请参阅http://perldoc.perl.org/perlsyn.html#Foreach-Loops

如果LIST的任何元素是左值,您可以通过修改循环内的VAR来修改它.相反,如果LIST的任何元素不是左值,则任何修改该元素的尝试都将失败.换句话说,foreach循环索引变量是您循环的列表中每个项的隐式别名.


yst*_*sth 9

最简单的方法就是复制它:

foreach my $var1 (@list) {
    my $var1_scratch = $var1;
Run Code Online (Sandbox Code Playgroud)

要么

foreach my $var1 ( map $_, @list ) {
Run Code Online (Sandbox Code Playgroud)

但是如果$ var1是一个引用,$ var1_scratch将是对同一个东西的引用.为了非常安全,你必须使用类似Storable :: dclone的东西来做一个深层复制:

foreach my $var1 ( @{ Storable::dclone( \@list ) } ) {
}
Run Code Online (Sandbox Code Playgroud)

(未经测试).然后你应该能够安全地改变$ var1.但如果@list是一个很大的数据结构,它可能会很昂贵.

  • @wazoox:他的意思是如果$ var1包含一个引用,例如@list包含一堆HASH引用.即使你打破别名,你仍然有另一个对同一事物的引用副本. (3认同)