就地修改输入的Perl运算符

就地修改输入的Perl运算符,perl,Perl,我最近做了一个Perl测试,其中一个问题是找到所有可以用来修改输入的Perl操作。选项是 我认为这些都不能修改现有的输入。我在这里遗漏了什么还是问题不对?试试这个: 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与

我最近做了一个Perl测试,其中一个问题是找到所有可以用来修改输入的Perl操作。选项是

我认为这些都不能修改现有的输入。我在这里遗漏了什么还是问题不对?

试试这个:

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
与此类似。对于
排序
$a
$b
变量是原始数组的别名,因此也可用于修改它。结果有些不可预测,这取决于Perl使用的排序算法(在不同版本的Perl中,排序算法一直在变化,但一段时间内没有变化)


do
eval
可以使用任意代码块,因此显然可以修改任何非只读变量,尽管不清楚这是否算作修改输入。斯莱德的例子使用了严格的
eval
形式,当然也应该算数。

我假设问题是测试学生是否知道正确使用
sort
map
等返回值,而不是在无效上下文中使用它们,并期望产生副作用。不过,完全可以修改给定的参数

map
grep
别名
$\
到每个元素,因此修改
$\
将更改传递给它的列表中变量的值(假设它们不是常量或文字)

eval EXPR
do EXPR
可以做任何事情,或多或少,因此没有任何东西可以阻止您执行以下操作:

my $code = q($code = 'modified');
eval $code;
say $code;
9  <@> sort lK/INPLACE,NUM
do BLOCK
eval BLOCK
的参数始终是一个文本代码块,据我所知,它们都不是有效的左值

sort
在像
@array=sort{$a$b}@array这样调用时有一个特殊的优化。如果您使用B::简明查看由此生成的操作码,您将看到如下内容:

my $code = q($code = 'modified');
eval $code;
say $code;
9  <@> sort lK/INPLACE,NUM
9排序lK/INPLACE,NUM

但是对于语言语义的问题,实现细节是不相关的。

您能展示一些就地修改的示例吗?谢谢斯莱德和托宾克!!mpapec请参考下面的答案。检查我上面的链接。所以他的测试有缺陷。没有选项说明上述所有内容