2014-09-06 54 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 

但關於語言的語義問題,實現細節是無關緊要的。