2014-09-06 53 views
1

最近我一个Perl测试的问题之一是找到所有可以用来修改其就地投入Perl的操作输入?选择很Perl的运算符修改就地

我不认为任何一个可以就地修改输入。我在这里错过了什么,或者是错误的问题?

谢谢。

+1

,你能否告诉到位修改一些例子吗? https://eval.in/189209 – 2014-09-06 06:40:01

+0

感谢斯莱德和tobyink! mpapec请参考下面的答案。 – prefetcher 2014-09-06 09:48:53

+0

检查我上面的链接。 – 2014-09-06 09:52:23

回答

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的连续形式应该可以算。

+0

所以他的测试是有缺陷的。没有选项说明'以上所有'。 – 2014-09-06 07:57:13

1

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

mapgrep别名$_每个元素,所以修改$_将改变变量的值传递给它的列表(假定他们不是常量或文字)。

eval EXPRdo EXPR可以做任何事情,或多或少,所以并没有什么东西做这样的事情阻止你:

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

的参数do BLOCKeval BLOCK总是代码文字块,这是不以任何我知道的方式有效的左值。

sort有当叫像@array = sort { $a <=> $b } @array;了特别的优化。如果你看看这个为B产生的操作码::简洁,你会看到类似这样的:

9 <@> sort lK/INPLACE,NUM 

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