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),执行最后一个脚本打印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 );
推荐阅读
- c++ - 分段故障类列表
- c# - PerformanceCounter 在我困惑的脸上抛出 AccessViolationException
- flutter - 优雅地处理 Flutter web 平台上的移动端插件
- c++ - 如何反转集合数组的顺序
- godot - 如何在Godot中让相机跟随玩家
- javascript - 错误:React 说 .map() 不是函数。API 返回对象,我无法对其进行迭代
- swiftui - SwiftUI - 确保在模型更新时从主线程发布值(通过接收(on :) 等运算符)
- angular - 如何在帖子返回中使用特定回复
- c# - 如何在 C# 中解压缩多层 zip 文件
- reactjs - 如何使用 toHaveBeenCalledWith 仅检查 URL?