Разница между * 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:

первая ссылка предполагает либо использование. В то время как второй дает список других альтернатив, но упоминает, как нужна ссылка, Если мы хотим благословить переменную. Никакой другой разницы не предлагается.

есть ли функциональная или предпочтительная разница в стиле этих двух косвенных файловых ручек?

  1. my $fh = *DATA;
  2. 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 со ссылкой на глобус, и он наиболее поддерживается, так что это то, что я использую, если мне нужно выбрать.