Как я могу прочитать строки файла в массив в Perl?
У меня есть файл с именем .txt вот такой:
тест
Фу!--6--> Барно я хочу поместить каждую строку в массив и распечатать строки следующим образом:
line1 line2 line3
но как я могу это сделать?
7 ответов
#!/usr/bin/env perl
use strict;
use warnings;
my @array;
open(my $fh, "<", "test.txt")
or die "Failed to open file: $!\n";
while(<$fh>) {
chomp;
push @array, $_;
}
close $fh;
print join " ", @array;
вот мой единственный лайнер:
perl -e 'chomp(@a = <>); print join(" ", @a)' test.txt
объяснение:
- читать файл по строкам в
@a
array -
chomp(..)
- удалить символы EOL для каждой строки - объединения
@a
использование пространства в качестве разделителя - напечатать результат
- передать имя файла в качестве параметра
еще один ответ для вас на выбор:
#!/usr/bin/env perl
open(FILE, "<", "test.txt") or die("Can't open file");
@lines = <FILE>;
close(FILE);
chomp(@lines);
print join(" ", @lines);
Если вы часто глотаете файлы, вы можете использовать File:: Slurp модуль от CPAN:
use strict;
use warnings;
use File::Slurp;
my @lines = read_file('test.txt');
chomp @lines;
print "@lines\n";
самый простой пример выглядит так:
#!/usr/bin/env perl
use strict;
use warnings;
open(F, "<", "test.txt") or die("Cannot open test.txt: $!\n"); # (1)
my @lines = ();
while(<F>) { chomp; push(@lines, $_); } # (2)
close(F);
print "@lines"; # (3) stringify
(1) - место, где открывается файл.
(2) дескрипторы файлов хорошо работают в среде списка (скалярные среды/среды списка определяются левым значением), поэтому, если вы назначаете массив дескриптору файла, все строки слурпируются в массив. Строки разделяются (заканчиваются) значением $/
входной разделитель записей. Если ты ... --5-->, вы можете использовать $IRS
или $INPUT_RECORD_SEPARATOR
. Это значение по умолчанию символ новой строки \n
;
хотя это казалось хорошей идеей, я просто забыл тот факт, что если вы напечатаете все строки, окончание \n
будет напечатана. Внимание мне.
изначально код:
my @lines = <F>;
вместо while
петли. Это все еще жизнеспособная альтернатива, но вы должны поменять (3) на chomp
ing, а затем печать / строка всех элементов:
for (@lines) { chomp; }
print "@lines";
(3) Stringifying означает преобразование массив в строку и вставка значения $"
между элементами массива. По умолчанию используется пробел.
посмотреть: страница perlvar.
таким образом, фактическая 2-я попытка:
#!/usr/bin/env perl
use strict;
use warnings;
open(F, "<", "test.txt") or die("Cannot open test.txt: $!\n"); # (1)
my @lines = <F>; # (2)
close(F);
chomp(@lines);
print "@lines"; # (3) stringify
Это самая простая версия, которую я мог придумать:
perl -l040 -pe';' < test.txt
что примерно эквивалентно:
perl -pe'
chomp; $\ = $/; # -l
$\ = 040; # -040
'
и:
perl -e'
LINE:
while (<>) {
chomp; $\ = $/; # -l
$\ = " "; # -040
} continue {
print or die "-p destination: $!\n";
}
'
это код, который делает это (предположим, что ниже код внутри script.pl):
use strict;
use warnings
my @array = <> ;
chomp @array;
print "@array";
Это:
scirpt.pl [your file]