Perl не печатает содержимое файла - PullRequest
0 голосов
/ 03 августа 2011

Я пишу скрипт на Perl, который читает из файла и печатает содержимое.Он читает файл без ошибок, но не печатает содержимое.

#!/usr/bin/perl

use warnings;
use strict;
use autodie;

my $dir = "/home/user/.fluxbox/.notify/notify";

if ( -e "$dir")
{
 open(NOTE, "+>>", $dir) or die( "Error opening file! $!");

 chomp(my @note = <NOTE>);

 print "File Contents:\n";
 print "@note\n";

 close(NOTE) or die "Can't close $dir: $!";
}

Вывод:

 Name "main::NOTE" used only once: possible typo at /path/to/script.pl line 13.
 File Contents:

Ответы [ 6 ]

4 голосов
/ 03 августа 2011

Когда вы открываете для добавления, которое оставляет смещение файла в конце файла, поэтому чтение даст вам немедленное подтверждение. Вам нужно seek назад (вероятно, вы хотите в начало файла), прежде чем чтение даст вам что-нибудь. Поскольку вы вообще не пишете, вам, вероятно, следует просто открыть файл только для чтения (как уже говорили другие)

3 голосов
/ 03 августа 2011

http://www.perlfect.com/articles/perlfile.shtml

mode          operand    create    truncate
read            <       
write           >          ✓         ✓
append          >>         ✓

Each of the above modes can also be prefixed with the + character 
to allow for simultaneous reading and writing.

mode          operand    create    truncate
read/write     +<       
read/write     +>          ✓         ✓
read/append    +>>         ✓

Вы используете read / append, поэтому он будет читать EOF и начинать там. Вам нужно использовать <, чтобы начать в начале файла.

2 голосов
/ 03 августа 2011

Файл усекается, потому что вы открываете его для записи (и чтения), что, как и в C (и некоторых других языках?), Означает, что файл усекается, если он уже существует. Если вы действительно хотите добавить текст в файл, вы хотите открыть его для , добавив (и читая), что в Perl выполняется с '+>>' вместо '+>'. Однако ваш сценарий ничего не записывает в файл, и ваше описание указывает на то, что вы хотите только читать из него, а не записывать в него, поэтому в этом случае вы должны просто открыть его для чтения только с '<'.

Кроме того, вы никогда не должны когда-либо использовать форму с двумя аргументами open; вместо этого всегда используйте форму с тремя аргументами (в данном случае open(NOTE, '+>>', $dir)).

РЕДАКТИРОВАТЬ: я забыл, что открытие файла для добавления устанавливает позицию файла в конец файла, и именно с этой позиции он начнет читать. Если вы действительно хотите прочитать файл, имея возможность добавить к нему (и то, что вы предоставили, пока не дает мотивации для последней возможности), после открытия файла вам нужно использовать [seek][1], чтобы установить поместите его в начало файла, и , затем , читая файл, даст вам его содержимое.

1 голос
/ 03 августа 2011

Вы не представляете, возникают ли ошибки, потому что вы никогда не проверяете их. Добавить

use autodie;

или проверьте правильность возвращаемых значений. единственный способ узнать, успешно ли a readline или print - это проверить close.

close(NOTE) || die "can't close $dir: $!";

Вы не можете проверить значение print или readline. Вы должны проверить `close.

Есть и другие проблемы, но это хорошее начало.

Теперь убедитесь, что в файле действительно есть что читать. Стат это и убедитесь, что вы прочитали так много байтов. Откуда ты знаешь, что там есть что почитать? Ваша статистика только проверяет существование. Он не проверяет размер, перманент или даже тип файла.

0 голосов
/ 03 августа 2011

Я пишу скрипт на Perl, который читает из файла и печатает содержание.

Что вам нужно:

  • Получить имя файла
  • Открыть дескриптор файла
  • Считать и распечатать данные

Вместо того, чтобы читать весь файл в память, предпочтительно использовать построчный режим while. Использование chomp удалит символы новой строки и существенно искажает вывод, поэтому не используйте его, если вам это не нужно.

Вам не нужно проверять, существует ли файл, поскольку open и autodie позаботятся об этом за вас. Этот сценарий также можно использовать с аргументом командной строки, например, script.pl filename.txt. Если это не требуется, удалите shift ||.

Код:

use strict;
use warnings;
use autodie;

my $file = shift || "/home/user/.fluxbox/.notify/notify";

open my $fh, '<', $file;

print "File contents:\n--------------\n";
print while (<$fh>);
0 голосов
/ 03 августа 2011
open(NOTE, "+>>", $dir) or die( "Error opening file! $!");

Ваша проблема - второй аргумент '+ >>'. Когда вы переключаете его на <, он работает. Я считаю, +>> означает «написать + добавить», тогда как < означает «прочитать».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...