Включить данные файла в массив Perl - PullRequest
2 голосов
/ 14 декабря 2011

Я пытаюсь передать все данные из файла в массив Perl, а затем пытаюсь использовать цикл foreach для обработки каждой строки в массиве.Проблема в том, что foreach вместо печати каждой отдельной строки печатает весь массив. Я использую следующий скрипт.

while (<FILE>) {
  $_ =~ s/(\)|\()//g;
  push @array, $_;
}

foreach $n(@array) {
  print "$n\n";
}

Скажем, например, данные в массиве @array=qw(He goes to the school everyday) массив печатается правильно, но цикл foreach вместо печати каждого элемента в другой строке печатает весь массив.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Поскольку весь файл занимает всего одну строку. Вы можете разбить строку на основе пробелов и напечатать каждый элемент массива в новой строке

use strict;
use warnings;

open(FILE,'YOURFILE' ) || die ("could not open");
my $line= <FILE>;
my @array = split ' ',$line;
foreach my $n(@array)
{
print "$n\n";
  }
close(FILE);

Входной файл

In recent years many risk factors for the development of breast cancer that .....

Выход

In
recent
years
many
risk
factors
for
the
development
of
breast
cancer
that
.....
0 голосов
/ 14 декабря 2011

После прочтения ваших комментариев, я предполагаю, что ваша проблема в том, что ваш исходный файл не содержит никаких новых строк: I.e. весь файл - только одна строка. Некоторые текстовые редакторы просто переносят текст без добавления каких-либо символов разрыва строки.

У этой проблемы нет «решения»; Вы должны добавить разрывы строк, где вы хотите их. Вы могли бы написать сценарий для этого, но я сомневаюсь, что это имело бы смысл. Все зависит от того, что вы хотите сделать с этим текстом.

Вот мои рекомендации по коду для вашего фрагмента.

chomp(@array = <FILE>);
s/[()]//g for @array;
print "$_\n" for @array;

или

@array = <FILE>;
s/[()]//g for @array;
print @array;

Обратите внимание, что если у вас есть файл из другой файловой системы, вы можете получить \r символов, оставшихся в конце ваших строк после chomp, в результате чего вывод будет выглядеть поврежденным, перезаписывая себя.

Дополнительные примечания:

  • (\)|\() лучше записать как класс символов: [()].
  • @array = <FILE> прочитает весь файл в массив. Незачем к петле.
  • Как показано в моих примерах, print может быть назначен список элементов (например, массив) в качестве аргументов. И вы можете иметь цикл постфикса печатать последовательно.
  • В цикле (postfix) все элементы цикла имеют псевдоним $_, это удобный способ сделать подстановки в массиве.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...