はperl -w -Mstrict
を使用して比較します、両方のグローバルシンボルは、明示的なパッケージ名を持っていない文句を言うmy()が条件付きで何が起こっていますか?
# case Alpha
print $c;
...
# case Bravo
if (0) {
my $c = 1;
}
print $c;
...
# case Charlie
my $c = 1 if 0;
print $c;
Alpha
とBravo
期待される。しかしCharlie
は、値のような多くの匂いれ、初期化されていないことだけを、同じ警告を与えるものではありません:
# case Delta
my $c;
print $c;
正確にフードの下で何が起こっていますか? (たとえこのようなものが生産コードのために書かれてはいけないのですが)
ブラボー場合には、 '$のC 'は、字句'(0)... 'ブロックは、それがある場合にスコープされますそのブロックの外でそれを参照するエラー( 'use strict'のもと) – mob
ところで、 'my $ c = 1 if 0; ... $ c ... 'は正式には定義されておらず(そのように文書化されています)、許可されず、望ましくない動作(クラッシュなど)が発生する可能性があります。さて、クラッシュすることはありませんが、それは可能です:) – ikegami
@ikegamiうーん、それはperlsynの "ステートメント修飾子"セクションの下に記載されています。良いリマインダー! –