如何避免PDL子例程中的输入修改

时间:2019-06-26 04:51:59

标签: perl pdl

我想避免赋值运算符.=修改子例程中的用户输入。

避免这种情况的一种方法是在子例程中执行输入的副本。这是最好的方法吗?还有其他解决方案吗?

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),执行最后一个脚本会两行打印10f_0不会就地修改用户输入,而f_1会进行修改。

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 );