Porównać użyciu perl -w -Mstrict
:Co się dzieje, gdy moja() jest warunkowa?
# case Alpha
print $c;
...
# case Bravo
if (0) {
my $c = 1;
}
print $c;
...
# case Charlie
my $c = 1 if 0;
print $c;
Alpha
i Bravo
zarówno narzekać globalny symbol nie mają wyraźnego nazwę pakietu, który należy się spodziewać. Ale Charlie
nie daje takiego samego ostrzeżenia, tylko, że wartość jest niezainicjowany, który pachnie dużo jak:
# case Delta
my $c;
print $c;
Co dokładnie dzieje się pod maską? (Nawet jeśli coś takiego nie powinno być nigdy zapisane w kodzie produkcyjnym)
W przypadku Bravo, '$ C' jest leksykalnie zawężona do' if (0) ... 'bloku, i jest to błąd (pod 'use strict'), aby odnieść się do niego poza tym blokiem. – mob
Nawiasem mówiąc, zachowanie 'my $ c = 1, jeśli 0; ... $ c ... 'jest oficjalnie niezdefiniowane (i udokumentowane jako takie), co oznacza, że jest niedozwolone i może spowodować niepożądane zachowanie (np. awarię). Cóż, to się nie zawiesi, ale może :) – ikegami
@ikegami hmm masz całkowitą rację, jest on wymieniony w sekcji "modyfikatory oświadczeń" w perlsyn. dobre przypomnienie! –