2016-12-22 63 views
5

Мне нужно передать результат «cat differentFiles» в программу perl6, требуя от программы принимать разные аргументы командной строки. Кажется, что Perl6 принимает первый аргумент в качестве файла для чтения. Я могу перезаписать мои подпрограммы, но я хочу использовать канал из оболочки. Есть ли способ сделать это?perl6 Как читать из stdin и брать аргументы командной строки?

Вот моя программа с именем testStdInArgs.pl:

say @*ARGS; 
for lines() { 
    say "reading ==> ", $_; 
} 

Я хочу сделать (Foo и бар аргументы):

cat logFile | perl6 testStdInArgs.pl foo bar 

Вот ошибки:

[foo bar] 
Earlier failure: 
(HANDLED) Unable to open file 'foo' 
    in block <unit> at stdInArgs.pl line 2 

Final error: 
Type check failed in binding to $iter; expected Iterator but got Failure (Failure.new(exception...) 
    in block <unit> at stdInArgs.pl line 2 

Большое спасибо

ответ

5

Функция lines является ярлыком для $*ARGFILES.lines.
$*ARGFILES - это волшебный дескриптор файла, который представляет собой конкатенацию файлов, указанных в качестве аргументов командной строки (@*ARGS), и возвращается к stdin только в том случае, если @*ARGS пуст.

Если вы всегда хотите, чтобы читать из стандартного ввода, используйте $*IN.lines:

for $*IN.lines { 
    say "reading ==> $_"; 
} 

Кроме того, пусть ваш код изменить @*ARGS, чтобы удалить любые аргументы командной строки, которые вы не хотите быть интерпретированы как имена файлов, и затем использование lines().

+1

Я вижу! Благодарю вас! $ * ARGFILES - это то, что я узнал от вас сегодня. Большое спасибо! Всегда что-то новое, чтобы учиться каждый день (даже если я не в области технологий/ИТ). – lisprogtor