簡體   English   中英

如何避免 PDL 子程序中的輸入修改

[英]How to avoid input modification in PDL subroutines

我想避免使用賦值運算符.=來修改來自子例程的用戶輸入。

避免這種情況的一種方法是在子例程內執行輸入的副本。 這是最好的方法嗎? 還有其他解決方案嗎?

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM