Разница между * DATA и * DATA
всякий раз, когда я хочу имитировать ввод и вывод в файловую ручку, я часто буду использовать ссылки на DATA и STDOUT соответственно:
use strict;
use warnings;
use autodie;
#open my $infh, '<', 'infile.txt';
my $infh = *DATA;
#open my $outfh, '>', 'outfile.txt';
my $outfh, *STDOUT;
print $outfh <$infh>;
__DATA__
Hello World
выходы:
Hello World
, в последние ответы Бородин продемонстрировал, что на самом деле нет необходимости брать ссылку. Вместо этого достаточно простого задания:
my $infh = *DATA;
поэтому я создал следующий скрипт для сравнения и контраста разницы между эти два метода:--10-->
use strict;
use warnings;
use Fcntl qw(:seek);
# Compare Indirect Filehandle Notation
my %hash = (
'*DATA' => *DATA,
'*DATA' => *DATA,
);
my $pos = tell DATA;
my $fmt = "%-8s %-22s %-7s %sn";
printf $fmt, qw(Name Value ref() readline());
while ( my ( $name, $fh ) = each %hash ) {
seek( $fh, $pos, SEEK_SET ); # Rewind FH
chomp( my $line = <$fh> );
printf $fmt, $name, $fh, ref($fh), $line;
}
__DATA__
Hello World
выходы:
Name Value ref() readline()
*DATA GLOB(0x7fdc43027e70) GLOB Hello World
*DATA *main::DATA Hello World
когда дело доходит до передачи и чтения из файла, нет никакой разницы между typeglob и ссылкой на typeglob.
переход от тестирования к исследовательской форме исследования показывает следующие страницы perldoc:
первая ссылка предполагает либо использование. В то время как второй дает список других альтернатив, но упоминает, как нужна ссылка, Если мы хотим благословить переменную. Никакой другой разницы не предлагается.
есть ли функциональная или предпочтительная разница в стиле этих двух косвенных файловых ручек?
my $fh = *DATA;my $fh = *DATA;
1 ответов
один-шар; один-ссылка на шар. Большинство мест принимают и то, и другое. Многие также принимают имя глобуса как строку, и многие принимают ссылку на объект ввода-вывода.
# Symbolic reference to the glob that contains the IO object.
>perl -E"$fh = 'STDOUT'; say $fh 'hi'"
hi
# Reference to the glob that contains the IO object.
>perl -E"$fh = \*STDOUT; say $fh 'hi'"
hi
# Glob that contains the IO object.
>perl -E"$fh = *STDOUT; say $fh 'hi'"
hi
# Reference to the IO object.
>perl -E"$fh = *STDOUT{IO}; say $fh 'hi'"
hi
open(my $fh, '<', ...) заполняет $fh со ссылкой на глобус, и он наиболее поддерживается, так что это то, что я использую, если мне нужно выбрать.