2- 3 аргумента открываются с '-'

Открывается следующее STDIN а затем повторить пользовательский ввод:

open my $in, '-';
print "You said: $_" while(<$in>);

Однако следующий фрагмент умирает, потому что он не может найти файл с именем '-':

open my $in, '<', '-'; # dies
print "You said: $_" while(<$in>);

Почему два аргумента open работать для этого, но три аргумента open умирает? Я надеялся на простой метод открытия файла или STDIN на основе пользовательского ввода, и я не хочу использовать 2-аргументное открытие.

3 ответа

Решение

perldoc -f open:

В форме с двумя аргументами (и с одним аргументом) открытие <- или же - открывает STDIN и открытие >- открывает STDOUT,

Я думаю, это дает понять, что особый подход к - специфичен для форм с одним или двумя аргументами.

Вы можете просто назначить \*STDIN на ваш $inили откройте файл на основе пользовательского ввода.

Как уже упоминалось, вы можете использовать STDIN вместо того, чтобы открыть его явно,

use autodie;

my $in;
$in = ($file eq "-") ? \*STDIN : open($in, "<", $file) && $in;

Открытие с тремя аргументами завершается неудачно, потому что нет файла с именем -, Вот и весь смысл трехаргуйного открытия. У меня должен быть способ открывать файлы без того, чтобы имена файлов рассматривались как код!


Это должно сделать трюк:

open(STDIN, '<', $qfn)
   if $qfn;

Технически, есть способ открытия STDIN с тремя аргами open,

# Creates a new system handle (file descriptor).
open(my $fh, '<&', fileno(STDIN));
open(my $fh, '<&', \*STDIN);
open(my $fh, '<', "/proc/$$/fd/".fileno(STDIN));  # Linux

# Creates a new Perl handle for the existing system handle
open(my $fh, '<&=', fileno(STDIN));
open(my $fh, '<&=', \*STDIN);
Другие вопросы по тегам