Каков slickest способ программно читать из stdin или входного файла (если предоставлено) в Perl?
Программно считывается из STDIN или входного файла в Perl
Ответ 1
while (<>) {
print;
}
будет читаться либо из файла, указанного в командной строке, либо из stdin, если файл не указан
Если вам нужна эта конструкция цикла в командной строке, вы можете использовать опцию -n
:
$ perl -ne 'print;'
Здесь вы просто помещаете код между {}
из первого примера в ''
во второй
Ответ 2
Это обеспечивает именованную переменную для работы с:
foreach my $line ( <STDIN> ) {
chomp( $line );
print "$line\n";
}
Чтобы прочитать файл, проведите его так:
program.pl < inputfile
Ответ 3
Вам нужно использовать < > operator:
while (<>) {
print $_; # or simply "print;"
}
который может быть спрессован до:
print while (<>);
Произвольный файл:
open F, "<file.txt" or die $!;
while (<F>) {
print $_;
}
close F;
Ответ 4
В некоторых ситуациях "скользкий" способ заключается в использовании переключателя -n
. Он неявно обертывает ваш код циклом while(<>)
и гибко управляет входным сигналом.
В slickestWay.pl
:
#!/usr/bin/perl -n BEGIN: { # do something once here } # implement logic for a single line of input print $result;
В командной строке:
chmod +x slickestWay.pl
Теперь, в зависимости от вашего ввода, выполните одно из следующих действий:
-
Дождитесь ввода пользователем
./slickestWay.pl
-
Чтение из файлов, названных в аргументах (не требуется перенаправление)
./slickestWay.pl input.txt ./slickestWay.pl input.txt moreInput.txt
-
Используйте трубку
someOtherScript | ./slickestWay.pl
Блок BEGIN
необходим, если вам нужно инициализировать какой-то объектно-ориентированный интерфейс, такой как Text:: CSV или некоторые такие, которые вы можете добавить к shebang с помощью -M
.
-l
и -p
также являются вашими друзьями.
Ответ 5
Если есть причина, вы не можете использовать простое решение, предоставленное ennuikiller выше, тогда вам придется использовать Typeglobs для управления файловыми дескрипторами. Это больше работает. В этом примере копируется из файла в $ARGV[0]
в файл $ARGV[1]
. По умолчанию это значения STDIN
и STDOUT
, если файлы не указаны.
use English;
my $in;
my $out;
if ($#ARGV >= 0){
unless (open($in, "<", $ARGV[0])){
die "could not open $ARGV[0] for reading.";
}
}
else {
$in = *STDIN;
}
if ($#ARGV >= 1){
unless (open($out, ">", $ARGV[1])){
die "could not open $ARGV[1] for writing.";
}
}
else {
$out = *STDOUT;
}
while ($_ = <$in>){
$out->print($_);
}
Ответ 6
Do
$userinput = <STDIN>; #read stdin and put it in $userinput
chomp ($userinput); #cut the return / line feed character
если вы хотите прочитать только одну строку
Ответ 7
Вот как я создал script, который может принимать либо входы командной строки, либо перенаправлять текстовый файл.
if ($#ARGV < 1) {
@ARGV = ();
@ARGV = <>;
chomp(@ARGV);
}
Это переназначает содержимое файла на @ARGV, оттуда вы просто обрабатываете @ARGV, как если бы кто-то включал параметры командной строки.
ПРЕДУПРЕЖДЕНИЕ
Если файл не перенаправлен, программа будет сидеть в режиме ожидания, потому что ожидает ввода от STDIN.
Я не понял способ определить, перенаправляется ли файл, но для устранения проблемы с STDIN.
Ответ 8
Бесстыдно украден из Neil Best и Рон
Предположим, что script name: stdinProcessor.pl
#!/usr/bin/perl
BEGIN: {
print "Doing some stuff first\n";
}
foreach $line ( <STDIN> ) {
chomp($line);
print "$line\n";
}
# Do something at the exit
print "Iteration done\n"
Пример:
$echo '1\n2\n3' | ./stdinProcessor.pl
Doing some stuff first
1
2
3
Iteration done
Ответ 9
if(my $file = shift) { # if file is specified, read from that
open(my $fh, '<', $file) or die($!);
while(my $line = <$fh>) {
print $line;
}
}
else { # otherwise, read from STDIN
print while(<>);
}