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 ответа
В форме с двумя аргументами (и с одним аргументом) открытие
<-
или же-
открывает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);