Perl: открытие файла - PullRequest
       1

Perl: открытие файла

6 голосов
/ 08 февраля 2011

Я пытаюсь открыть файл, полученный в качестве аргумента.

Когда я сохраняю аргумент в глобальной переменной open работает успешно.

Но

Если я использую метод give, то при открытии не удается открыть файл.

В чем причина.

#use strict;
use warnings;

#my $FILE=$ARGV[0];   #open Fails to open the file $FILE

$FILE=$ARGV[0];        #Works Fine with Global $FILE
open(FILE)
    or
die "\n ". "Cannot Open the file specified :ERROR: $!". "\n";

Ответы [ 4 ]

13 голосов
/ 08 февраля 2011

Унарное открытие работает только с пакетными (глобальными) переменными. Это задокументировано на странице руководства .

Лучший способ открыть файл для чтения:

my $filename = $ARGV[0];           # store the 1st argument into the variable
open my $fh, '<', $filename or die $!; # open the file using lexically scoped filehandle

print <$fh>; # print file contents

P.S. всегда используйте strict и warnings при отладке ваших скриптов Perl.

7 голосов
/ 08 февраля 2011

Это все в perldoc -f open:

Если EXPR опущен, скалярная переменная с тем же именем, что и FILEHANDLE, содержит имя файла.(Обратите внимание, что лексические переменные - объявленные с «my» - не будут работать для этой цели; поэтому, если вы используете «my», укажите EXPR в своем вызове open.)

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

Использование лексического дескриптора файла позволяет контролировать область его действия.и обрабатывает закрытие автоматически:

open my $fh, '<', "filename" or die "string involving $!";

И если вы берете это имя файла из командной строки, вы можете покончить с этим open или любым другим дескриптором в целом, и использовать обычный <> оператор для чтения из аргументов командной строки или STDIN.(подробности см. в комментариях)

6 голосов
/ 08 февраля 2011
use strict;
use warnings;

my $file_name = shift @ARGV;
open(my $file, '<', $file_name) or die $!;
…
close($file);

Всегда используйте strict и warnings. Если кто-то из них жалуется, исправьте код, не закомментируйте прагмы. Вы также можете use autodie, чтобы избежать явного or die после открытия, см. autodie .

3 голосов
/ 08 февраля 2011

С Документы Perl для open ()

Если EXPR опущен, скалярная переменная с тем же именем, что и FILEHANDLE, содержит имя файла.(Обратите внимание, что лексические переменные - объявленные с помощью my - не будут работать для этой цели; поэтому, если вы используете my, укажите EXPR в своем вызове open.)

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