Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Массив = содержимое файла. Почему не работает?


Автор: PyccHeBa 30.11.2007, 06:35
Почем он читает только первую строку? Мне надо в массив загнать все строки.

#!/usr/bin/perl

# Include library files.
# Library file for parsing excel files.
# use Spreadsheet::ParseExcel;
# Library file for working with databases.
# use DBI;

$filename = "mnogostrok.txt";

    open (F1, $filename) || die ("Could not open $filename");
    @data = <F1>;
    foreach my $i (@data) {
    print "$i\n";
}

Автор: KSURi 30.11.2007, 06:47
У меня ваш код работает.

Попробуйте еще так на всякий случай:
Код

...
local $/ = undef;
my $data = <F1>;
print $data;

Автор: nitr 30.11.2007, 10:52
проверьте так smile

Код
#!/usr/bin/perl
use strict;
use warnings;

my $filename = "mnogostrok.txt";
open my $flh, '<', $filename or die "Couldn't open $filename: $!";
my @data = <$flh>;
close $flh;

print join("", @data);

Автор: KSURi 30.11.2007, 18:50
nitr, а в чем разница использования SCALAR вместо GLOB в данном случае?
Только сейчас об этом задумался...

Автор: nitr 30.11.2007, 21:05
Ну как ответить, чтобы не запутать... Я отдаю предпочтение перлу выбирать.
Это допускается с версии 5.6, этот метод называется autovivifies, получаем косвенный файловый манипулятор/(создается анонимный тип-глоб и сохраняется ссылка на него), к примеру, очень удобно с ним работать к примеру в функциях, не надо думать какой манипулятор заюзать (имя), всё автоматически.

Подробнее:
1) perldoc perlfunc open,
2) Книга: "Perl: Сборник рецептов 2-е издание" параграф 7.5 smile

Автор: PyccHeBa 1.12.2007, 00:43
Вот в чем дело. Он открывает все строки, но задает их все сразу в один элемент массива. А мне нужно чтобы массив собрал строки в разные элементы

Автор: nitr 1.12.2007, 01:11
PyccHeBa, чего-чего?

Добавлено через 26 секунд
Покажите "на пальцах", я не понял вашей мысли...

Автор: KSURi 2.12.2007, 19:34
nitr, спасибо за интересную информацию. Разберусь на досуге.

Автор: amg 3.12.2007, 07:13
Цитата(PyccHeBa @ 1.12.2007,  00:43)
Вот в чем дело. Он открывает все строки, но задает их все сразу в один элемент массива.

Такое случится только в том случае, если где-то выше была переопределена переменная $/ (INPUT RECORDS SEPARATOR) с умолчаемого значения "\n" на undef (не обязательно, чтобы этой переменной был присвоен undef в явном виде, достаточно local $/; в той же области видимости). 

См. http://forum.vingrad.ru/index.php?showtopic=184608&view=findpost&p=1332712 KSURi, в котром упоминается $/: если там заменить скалярную переменную на массив, то все содержимое файла будет в первом элементе этого массива.

Автор: nitr 3.12.2007, 10:58
PyccHeBa, можно было не собирать со всех ответов, а взять только один, и просто проверить, к примеру, мой ответ не должен содержать эти ошибки, да и другие тоже smile т.к. скрипт изначально прост...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)