首页 > 解决方案 > 如何避免 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),执行最后一个脚本打印10行。f_0不会就地修改用户输入,而f_1会。

标签: perlpdl

解决方案


根据FAQ 6.17,当我在不同变量中对同一个PDL对象有多个引用时会发生什么

Piddles 在很多方面表现得像 Perl 引用。所以当你说

$a = pdl [0,1,2,3]; $b = $a;   

然后两者都$b指向$a同一个对象,例如然后说

$b++; 

不会创建原始 piddle 的副本,只是在适当的位置增加
[...]
在将 piddles 传递到子例程时,记住 piddles 的“参考性质”很重要。如果您修改输入 piddles,您会修改原始参数,而不是它的副本。这与其他一些数组处理语言不同,但可以非常有效地在子例程之间传递 piddles。如果您不想修改原始参数而是要修改它的副本,只需显式创建一个副本...

所以是的,为了避免修改原始文件,请像您一样创建一个副本:

my $x = $input->copy;

或者:

my $x = pdl( $input );

推荐阅读