[英]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),執行最后一個腳本會在兩行中打印1
和0
。 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.