Який найгарячіший спосіб програмно читати з stdin або вхідного файлу (якщо передбачено) у Perl?
Відповіді:
while (<>) {
print;
}
читатиме або з файлу, вказаного в командному рядку, або зі stdin, якщо файл не вказано
Якщо вам потрібна ця побудова циклу в командному рядку, тоді ви можете використовувати -n
опцію:
$ perl -ne 'print;'
Тут ви просто поміщаєте код між {}
першим прикладом і ''
другим
@ARGV = "/path/to/some/file.ext";
і він зчитує файл - так що ви навіть можете запрограмувати файл за замовчуванням за певних умов.
perl -n -e '$_ = uc($_); print;' yourfile
. За допомогою -p замість -n, perl автоматично друкує $ _ в кінці.
my @slurp = <>; foreach my $line (@slurp) { ... }
while (my $line = <>) {...
?
Це забезпечує іменовану змінну для роботи:
foreach my $line ( <STDIN> ) {
chomp( $line );
print "$line\n";
}
Щоб прочитати файл, вставте його так:
program.pl < inputfile
foreach my $line ( <STDIN> ) {
я погоджуюсь з @MikeKulls. Це не вина Perl, якщо сценарії Perl є нечитабельними. Тут винні програмісти!
while(my $line = <>) { print $line; }
.
while (my $line = <>, defined $line) { ... }
або while (<>) { my $line = $_; }
щоб уникнути зупинки на порожньому рядку?
Найбільш «найсмачніший» спосіб у певних ситуаціях - скористатися -n
перемикачем . Він неявно обгортає ваш код while(<>)
циклом і гнучко обробляє введення.
В slickestWay.pl
:
#! / usr / bin / perl -n ПОЧАТИ: { # зробіть щось тут один раз } # реалізувати логіку для одного рядка вводу надрукувати результат $;
У командному рядку:
chmod +x slickestWay.pl
Тепер, залежно від вашого вводу, зробіть одне з наступного:
Зачекайте введення користувачем
./slickestWay.pl
Читання з файлів, названих у аргументах (перенаправлення не потрібне)
./slickestWay.pl input.txt
./slickestWay.pl input.txt moreInput.txt
Використовуйте трубу
someOtherScript | ./slickestWay.pl
BEGIN
Блок необхідний , якщо вам потрібно форматувати яке - то об'єктно-орієнтований інтерфейс, такі як Text :: CSV або деякі такі, які ви можете додати в кубло з -M
.
-l
а -p
також ваші друзі.
Вам потрібно використовувати оператор <>:
while (<>) {
print $_; # or simply "print;"
}
Що можна ущільнити:
print while (<>);
Довільний файл:
open F, "<file.txt" or die $!;
while (<F>) {
print $_;
}
close F;
Якщо є причина, по якій ви не можете використовувати просте рішення, надане 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($_);
}
$ARGV[0]
etc на іншу змінну), де всі інші відповіді не вдаються ...
unshift
ім'я файлу на @ARGV
і використовувати оператор алмазного <>
.
Роби
$userinput = <STDIN>; #read stdin and put it in $userinput
chomp ($userinput); #cut the return / line feed character
якщо ви хочете прочитати лише один рядок
Ось як я створив скрипт, який може приймати або введення з командного рядка, або перенаправляти текстовий файл.
if ($#ARGV < 1) {
@ARGV = ();
@ARGV = <>;
chomp(@ARGV);
}
Це перепризначить вміст файлу @ARGV, звідти ви просто обробляєте @ARGV так, ніби хтось включав параметри командного рядка.
ПОПЕРЕДЖЕННЯ
Якщо жоден файл не переспрямовано, програма буде сидіти в режимі очікування, оскільки вона чекає введення від STDIN.
Я ще не знайшов способу виявити, чи перенаправляється файл, щоб усунути проблему STDIN.
$#ARGV < 1
замість того, що (як я думаю), більш зрозуміле @ARGV == 1
?
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(<>);
}
<>
оператор автоматично знайде і прочитає будь-які файли, наведені в командному рядку. У цьому немає необхідності if
.
shift
тут робите