我想避免赋值运算符.=
修改子例程中的用户输入。
避免这种情况的一种方法是在子例程中执行输入的副本。这是最好的方法吗?还有其他解决方案吗?
use PDL;use strict;
my $a=pdl(1);
f_0($a);print "$a\n";
f_1($a);print "$a\n";
sub f_0{
my($input)=@_;
my $x=$input->copy;
$x.=0;
}
sub f_1{
my($input)=@_;
$input.=0;
}
在我的情况下(perl 5.22.1),执行最后一个脚本会两行打印1
和0
。 f_0
不会就地修改用户输入,而f_1
会进行修改。
答案 0 :(得分:1)
根据常见问题解答6.17 What happens when I have several references to the same PDL object in different variables:
在许多方面,Piddle的行为类似于Perl引用。所以当你说
$a = pdl [0,1,2,3]; $b = $a;
然后,
$b
和$a
指向同一个 对象,例如然后说$b++;
将不创建原始小提琴的副本,而只是 就地增加
[...]
重要的是要记住小提琴的“参考性质” 把小声传进子程序。如果您修改输入小提琴, 修改原始参数,而不是其副本。这不同于 其他一些数组处理语言,但是非常有效 在子程序之间传递小费。如果您不想修改 原始参数,而是一个副本,只是创建一个副本 明确地...
是的,为避免修改原始文档,请像您一样创建副本:
my $x = $input->copy;
或者:
my $x = pdl( $input );