2014-10-06 69 views
1

這裏是我的Perl代碼:爲什麼這個詞彙變量在循環後沒有保留它的值?

use strict; 
use warnings; 

my @words = ("alpha", "bravo", "charlie"); 

(my $word = $_) foreach @words; 

print $word; 

我希望這個代碼做兩件事情之一:

  1. 打印字符串「查理」,這是$word最終值在循環後做完了。
  2. 抱怨編譯錯誤,因爲my $word是一個詞法變量,其範圍是foreach循環;它不存在於最後一行。

相反,它似乎的$wordundef和Perl提出了警告,並打印出空字符串。

爲什麼?

+1

我有點驚訝'警告'或'strict'沒有抱怨,因爲對我來說,這看起來像變量不再在範圍內。 – Sobrique 2014-10-06 11:34:42

回答

6

perldoc perlsyn

注意:一個我,國家的行爲,或我們的一份聲明中修改有條件的或循環結構修改(例如,我的$ x如果...)是未定義。我的變量的值可能是undef,任何以前分配的值,或者可能是其他任何值。不要依賴它。未來版本的perl可能會做一些與您嘗試使用的perl版本不同的東西。這裏是龍。

+0

投票正確答案時請發表評論。 – 2014-10-06 11:39:29

+0

但*爲什麼*?爲什麼Perl不會簡單地聲明'EXPRESSION foreach LIST'在語法上等同於'foreach(LIST){EXPRESSION}'?這難道不是那麼簡單和可預測嗎? – qntm 2014-10-06 12:46:04

+2

因爲它不完全相同。使用語句修飾符的版本不會創建新的詞法範圍,因此運行速度顯着提高。 (因爲它不會創建新的詞法範圍,這也意味着詞法變量不能僅限於該語句) – tobyink 2014-10-06 12:49:25

相關問題