预告我的$ var(@list)— $ var是一个参考?
题
所以,我从来不知道这一点,我希望得到一些澄清。我知道你是否
foreach (@list){
如果在该循环中更改$ _,则会影响实际数据。但是,我不知道如果你做了
foreach my $var1 (@list){
如果您在循环中更改了$ var1,它将更改实际数据。 : - /那么,有没有办法循环@list但保持变量是只读副本,或者如果更改的副本不会更改@list中的值?
解决方案
$ var
依次为每个项目设置别名。
请参阅 http://perldoc.perl.org/perlsyn.html#Foreach-Loops
如果LIST的任何元素是左值,您可以通过修改循环内的VAR来修改它。 相反,如果LIST的任何元素不是左值,则任何修改该元素的尝试 将失败。换句话说,foreach循环索引变量是每个的隐式别名 您正在循环的列表中的项目。
其他提示
最简单的方法就是复制它:
foreach my $var1 (@list) {
my $var1_scratch = $var1;
或
foreach my $var1 ( map 最简单的方法就是复制它:
foreach my $var1 (@list) {
my $var1_scratch = $var1;
或
foreach my $var1 ( @{ Storable::dclone( \@list ) } ) {
}
但是如果$ var1是一个引用,$ var1_scratch将是对同一个东西的引用。
为了非常安全,你必须使用像Storable :: dclone这样的东西来做深层复制:
<*>
(未测试)。然后你应该能够安全地改变$ var1。但如果这样做可能会很昂贵
@list是一个很大的数据结构。
, @list ) {
但是如果$ var1是一个引用,$ var1_scratch将是对同一个东西的引用。 为了非常安全,你必须使用像Storable :: dclone这样的东西来做深层复制:
<*>(未测试)。然后你应该能够安全地改变$ var1。但如果这样做可能会很昂贵 @list是一个很大的数据结构。
这是别名,不是参考。如果你想创建自己的别名(在for之外)你可以使用数据::别名的。
这些循环之间的唯一区别是:
foreach (@array) { ... }
foreach my $var (@array) { ... }
是循环变量。别名是 foreach
的函数,而不是隐式变量 $ _
。请注意,这是别名(同一事物的另一个名称),而不是引用(指向事物的指针)。
在简单(和常见)的情况下,您可以通过复制来破坏别名:
foreach my $var (@array) {
my $copy = $var;
# do something that changes $copy
}
这适用于普通的标量值。对于参考(或对象),您需要使用 Storable 或克隆,这可能很昂贵。绑定变量也存在问题, perlsyn 建议完全避免这种情况。
我不知道如何在foreach语句本身中强制变量为by-value而不是by-reference。您可以复制 $ _
的值。
#!/usr/perl/bin
use warnings;
use strict;
use Data::Dumper;
my @data = (1, 2, 3, 4);
print "Before:\n", Dumper(\@data), "\n\n\n";
foreach (@data) {
my $v = 我不知道如何在foreach语句本身中强制变量为by-value而不是by-reference。您可以复制 $ _
的值。
<*>;
$v++;
}
print "After:\n", Dumper(\@data), "\n\n\n";
__END__
在for语句中复制@list:
foreach my $var1 (() = @list) {
# modify $var without modifying @list here
}