就地修改输入的Perl运算符
我最近做了一个Perl测试,其中一个问题是找到所有可以用来修改输入的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与
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请参考下面的答案。检查我上面的链接。所以他的测试有缺陷。没有选项说明上述所有内容
。