2009-09-28 88 views
4

下面的代碼給出了一個錯誤信息:有沒有辦法修改foreach循環變量?

#!/usr/bin/perl -w 

foreach my $var (0, 1, 2){ 
    $var += 2; 
    print "$var\n"; 
} 

Modification of a read-only value attempted at test.pl line 4.

有什麼辦法修改$var? (我只是問了好奇。我其實很驚訝地看到此錯誤消息)

+0

爲什麼你*想*修改循環變量?這聽起來像是一種使循環行爲不可預測的方式。 *但也許這就是你想要的?* – pavium 2009-09-28 04:50:11

+3

它不會使循環行爲不可預知,因爲它不會干擾迭代器。結果可能是意想不到的,但它是完全可預測的。 – 2009-09-28 05:31:57

+0

+1好奇心和渴望理解錯誤信息,即使你已經找到了解決方法:-)。 – sleske 2009-09-28 09:01:28

回答

12

在​​結構,$var變得別名循環的元素,在這個意義上的$var的內存地址將是與@list的元素相同的地址。因此,您的示例代碼嘗試修改只讀值,並且您收到錯誤消息。

這個小腳本將展示什麼是在foreach結構回事:

my @a = (0,1,2); 
print "Before: @a\n"; 
foreach my $var (@a) { 
    $var += 2; 
} 
print "After: @a\n"; 

Before: 0 1 2 
After: 2 3 4 

附加信息:從perlsynThis item容易掩飾,但給人的整體瓢:

Foreach循環

...

如果LIST的任何元素都是左值,則可以通過修改循環中的VAR 來修改它。相反,如果LIST中的任何元素不是左值,則任何試圖修改該元素的 都將失敗 。換句話說,「foreach」 循環索引變量是一個隱含的 列表中的每個項目的別名,它們是 ,您正在循環。

5

Perl正在抱怨常量的值,而不是循環變量。它所抱怨的只讀值是你的0,因爲$var是它的別名,它不存儲在變量中(這是你可以改變的東西)。如果你遍歷一個數組或變量列表,你沒有這個問題。

4

弄清楚爲什麼以下不會導致在同一消息中還有很長的路要走改善你爲什麼該消息在第一時間發出的理解:

#!/usr/bin/perl 

use strict; 
use warnings; 

for my $x (@{[ 0, 1, 2 ]}) { 
    $x += 2; 
    print $x, "\n"; 
} 
相關問題