Forma bareword jest zasadniczo historycznym dziedzictwem ze względu na kompatybilność wsteczną. Używanie zmiennej leksykalnej jest właściwie zawsze właściwym zadaniem w nowym kodzie.
→ notabene $x
jest leksykalne zmienną skalarną, gdzie FOO
jest, jak pan powiedział, zwane gołe słowo
Szczegóły/dygresja
Tylko dla kompletności, jak wskazano w @Joe_Z komentarze, leksykalne obiekty filehandle są "względnie nowe", jako część raczej poważnej przeróbki między Perl 5.005 a 5.6 (nawet zyskały całe rzędy wielkości w tym numerze wersji ...).
Jednak technicznie, bareword FOO
(lub np. STDIN
) jest interpretowany w oddzielnej przestrzeni nazw tylko dla uchwytów plików. Ponieważ nie jest Sigil (jak $ @ % &
) dla nazw filehandle, istnieją tylko dwa sposoby odwołujące uchwytu pliku w tej przestrzeni nazw:
- Można odwołać się do niego w gnieździe pośrednim Celem niektórych funkcji, jak
print
, który (za kulisami) wywnioskuje, że bareword musi odnosić się do uchwytu pliku, z przyczyn historycznych;
- Możesz użyć typeglob, jak
*FOO
, który odnosi się do "wszystkiego w dowolnej przestrzeni nazw, która jest związana z symbolem FOO
.
Należy zauważyć, że w niektórych językach, takich jak C lub programu, pojedynczy symbol ma sigile typu, a więc wszystkie symbole mogą być związane tylko w jeden sposób (np nie można mieć zmienną o nazwie printf
oraz funkcja o nazwie printf
w C ... ogólnie), podczas gdy w Perlu lub (np) Common Lisp, ten sam symbol foo
może wiązać się z wieloma różnymi rzeczami; rozróżnienie polega na tym, że Perl w rzeczywistości wymaga użycia sigilów, aby rozróżnić "co to jest foo
" w większości kontekstów. $foo
, @foo
= @foo[ $x .. $y]
, $foo[ $n ]
, %foo
= @foo{ $k1, $k2 }
= $foo{ $k }
, &foo
i tym podobne.
Korzystając gołe słowa jako uchwytów plików, choć, można stracić kilka możliwości:
znacząco, aby powiązać je lokalnie lub leksykalnie (zamiast globalnie), trzeba wiązać każdy symbolu w każdej przestrzeni nazw, ponieważ nie ma sygnatury. Tak więc, my $foo
i my @foo
mogą żyć w dwóch różnych scratchpadach (zakresach), gdzie być może jeden przeżyje drugi; ale my *foo
zawierałby oba te elementy, a także uchwyt pliku foo
(i potencjalnie inne niejasne przypadki narożne, takie jak specyfikatory format
, chociaż nie przysięgłbym na to).
Niezmiernie trudno jest przekazać uchwyt pliku w stylu bareword do funkcji i tym podobne.
Zasadniczo, barewords dziedziczą wszystkie wady globalnego zasięgu i nie mają żadnych zalet zmiennych leksykalnych.
perldoc perldata
ma ładny dział na Kufle i rękojeści, które prawdopodobnie wyjaśniają te kwestie nieco jaśniej. Nie mam przy sobie mojego egzemplarza, ale wierzę, że Camel również bardziej szczegółowo zajmie się tym tematem.
wielkie pytanie, zawsze byłem zdenerwowany przez tę składnię – qwwqwwq
Kinda denerwujące robić 'open (STDOUT," less ")' w jakikolwiek inny sposób. – tchrist