【问题标题】:How to avoid input modification in PDL subroutines如何避免 PDL 子程序中的输入修改
【发布时间】:2019-11-07 23:06:08
【问题描述】:

我想避免使用赋值运算符.= 来修改来自子程序的用户输入。

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

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 会。

【问题讨论】:

    标签: perl pdl


    【解决方案1】:

    根据常见问题解答6.17 What happens when I have several references to the same PDL object in different variables

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

    【讨论】:

    • 感谢您的回答。但是,我必须评论说,“...如果您修改输入 piddles 您修改原始参数,而不是它的副本...”这句话有点误导:如果在 f_1 子例程中替换 '.='通过'=',则根本不修改用户输入。赋值运算符 '.=',我认为是 PDL 的东西,对于重现这种行为很重要。
    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多