我最近进行了Perl测试,其中一个问题是找到可用于修改其输入的所有Perl操作?选项是
我认为其中任何一项都不能就地修改输入。我在这里遗漏了什么或问题是错的吗?
感谢。
答案 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";
do
和eval
可以采用任意代码块,因此显然可以修改任何非只读变量,但不清楚是否会将其视为修改输入。斯莱德使用eval
的弦状形式的例子当然应该算在内。
答案 1 :(得分:1)
我假设问题正在测试,看看学生是否知道如何正确使用sort
,map
等的返回值,而不是在void上下文中使用它们并期待副作用。但是,完全可以修改给定的参数。
map
和grep
别名$_
,因此修改$_
会更改传递给它的列表中的变量值(假设它们不是常数或文字)。
eval EXPR
和do EXPR
可以做更多或更少的事情,所以没有什么可以阻止你做以下事情:
my $code = q($code = 'modified');
eval $code;
say $code;
do BLOCK
和eval BLOCK
的参数始终是一个字面的代码块,它不是我知道的任何有效左值。
sort
在调用@array = sort { $a <=> $b } @array;
时有一个特殊的优化。如果你看一下用B :: Concise生成的操作码,你会看到类似的东西:
9 <@> sort lK/INPLACE,NUM
但是关于语言语义的问题,实现细节是无关紧要的。