Как я могу считать строки файла в массив в Perl?

Некоторый объект предполагает .dispose() метод, который вынуждает ресурс быть удаленным из памяти.

10
задан brian d foy 10 December 2009 в 18:08
поделиться

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;
21
ответ дан 3 December 2019 в 13:40
поделиться

Вот мой единственный лайнер:

perl -e 'chomp(@a = <>); print join(" ", @a)' test.txt

Пояснение:

  • читать файл по строкам в @a массив
  • chomp (..) - удалить символы EOL для каждой строки
  • объединить @a с использованием пробела в качестве разделителя
  • результат печати
  • передать имя файла в качестве параметра
14
ответ дан 3 December 2019 в 13:40
поделиться

Еще один ответ на ваш выбор:

#!/usr/bin/env perl

open(FILE, "<", "test.txt") or die("Can't open file");
@lines = <FILE>;
close(FILE);
chomp(@lines);
print join(" ", @lines);
2
ответ дан 3 December 2019 в 13:40
поделиться

Если вы часто прихлебываете файлы, вы можете использовать модуль File :: Slurp из CPAN:

use strict;
use warnings;
use File::Slurp;

my @lines = read_file('test.txt');
chomp @lines;
print "@lines\n";
2
ответ дан 3 December 2019 в 13:40
поделиться

Самый простой пример выглядит примерно так:

#!/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) Дескрипторы файлов прекрасно работают в средах списков (среды скаляров / списков определяются левым значением), поэтому, если вы назначаете массив к дескриптору файла все строки помещаются в массив. Строки разделяются (заканчиваются) значением $ / , разделителем входных записей. Если вы используете английский язык; , вы можете использовать $ IRS или $ INPUT_RECORD_SEPARATOR . Это значение по умолчанию - символ новой строки \ n ;

Хотя это казалось хорошей идеей, я просто забыл тот факт, что если вы напечатаете все строки, окончание \ n также будет напечатан. Baaad me.

Первоначально код был:

my @lines = <F>;

вместо цикла while . Это все еще жизнеспособная альтернатива, но вы должны заменить (3) на chomp ing, а затем распечатать / преобразовать все элементы в строку:

for (@lines) { chomp; }
print "@lines";

(3) Строковое преобразование означает преобразование массива в строку и вставку значения $ " между элементами массива. По умолчанию используется пробел.

См .: страница perlvar .

Таким образом, реальная вторая попытка:

#!/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
2
ответ дан 3 December 2019 в 13:40
поделиться

Это самая простая версия, которую я мог придумать:

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";
    }
'
1
ответ дан 3 December 2019 в 13:40
поделиться

Это код, который делает это (предположим, что код ниже внутри script.pl):

use strict;
use warnings
my @array = <> ;
chomp @array;
print "@array";

Он запускается:

scirpt.pl [your file]
1
ответ дан 3 December 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: