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循环索引变量是您循环的列表中每个项的隐式别名.
最简单的方法就是复制它:
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是一个很大的数据结构,它可能会很昂贵.