2016-11-27 10 views
4

В Perl filehandle является типом данных, и я ожидал бы, что переменная такого типа имеет какой-то префикс sigil. Однако, следующий код (второй разомкнут) показывает, что это не такПочему файловый дескриптор не нуждается в сигиле в Perl?

open my $fileHandle, '>', "out.txt"; 
open FH, '>', "out2.txt"; 

Я нашел вторую форму запутанным/противоречива. В чем причина разрешения второй формы?

ответ

6

Вторая форма разрешена, потому что она оригинальная. Раньше вы могли ссылаться только на дескрипторы файлов по имени глобуса, содержащего их. Теперь дескрипторы файлов могут быть именем glob или ссылкой на glob, обернутый вокруг объекта filehandle или ссылкой на объект filehandle. Последние два могут быть сохранены в скаляре (и поэтому могут лексически охвачены).

Вам следует избегать использования шаров в качестве дескрипторов файлов в новом коде.

+0

ysth: Как «ссылка на глобус, обернутый вокруг объекта filehandle», отличный от «ссылки на объект дескриптора файла»? Не могли бы вы привести примеры этих двух случаев? – Ltf4an

+0

@ Ltf4an вам нужно уйти с вашего пути, чтобы получить последнее (например, '* SOMEGLOB {IO}' или 'Symbol :: geniosym()'); Я упомянул об этом только для полноты. Обычно нет никаких оснований, если вы не играете с таблицей символов. – ysth

4

Вообще говоря, вам нужна сигила при ссылке на глобус.

my $fh = STDOUT; # XXX Short for: my $fh = "STDOUT"; 
my $fh = *STDOUT; # ok 

Однако функции, которые ожидают Glob (например open, print, readline ака <> и т.д.) делают его по желанию.

print STDOUT "foo\n"; # Short for: print *STDOUT "foo\n"; 

Вы можете приблизить это с * прототипа.

sub foo { } 
sub bar(*) { } 

foo(STDOUT); # XXX Fails when using "use strict;" 
bar(STDOUT); # ok 

Что является причиной для предоставления 2-й формы?

Вторая форма (которая использует глобальный символ) предшествует поддержку open(my $fh, ...) введенный в 5.6. Фактически, это предшествует существованию лексических (my) переменных. Поскольку по возможности следует избегать глобальных переменных, open(FH, ...) не рекомендуется.