Perl操作符可以就地修改输入

时间:2014-09-06 06:33:07

标签: perl

我最近进行了Perl测试,其中一个问题是找到可用于修改其输入的所有Perl操作?选项是

我认为其中任何一项都不能就地修改输入。我在这里遗漏了什么或问题是错的吗?

感谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

my @array = qw(1 2 3 4);
print "@array\n";

my @new_array = map ++$_, @array;

print "@new_array\n";
print "@array\n";  # oops, we modified this in-place

grep类似。对于sort$a$b变量是返回原始数组的别名,因此也可用于修改它。结果有些不可预测,这取决于Perl正在使用的排序算法(在不同版本的Perl中历史性地发生了变化,虽然暂时没有改变)。

my @arr = qw(1 2 3 4 5);
my @new = sort { ++$a } @arr;
print "@arr\n";

doeval可以采用任意代码块,因此显然可以修改任何非只读变量,但不清楚是否会将其视为修改输入。斯莱德使用eval的弦状形式的例子当然应该算在内。

答案 1 :(得分:1)

我假设问题正在测试,看看学生是否知道如何正确使用sortmap等的返回值,而不是在void上下文中使用它们并期待副作用。但是,完全可以修改给定的参数。

每个元素都有

mapgrep别名$_,因此修改$_会更改传递给它的列表中的变量值(假设它们不是常数或文字)。

eval EXPRdo EXPR可以做更多或更少的事情,所以没有什么可以阻止你做以下事情:

my $code = q($code = 'modified');
eval $code;
say $code;

do BLOCKeval BLOCK的参数始终是一个字面的代码块,它不是我知道的任何有效左值。

sort在调用@array = sort { $a <=> $b } @array;时有一个特殊的优化。如果你看一下用B :: Concise生成的操作码,你会看到类似的东西:

9  <@> sort lK/INPLACE,NUM

但是关于语言语义的问题,实现细节是无关紧要的。