Это, как я открыть файл в Perl:Открыть файл с или без расширения
open FILE, "</file.ext";
Как открыть файл file
независимо от того, если это называется file
или file.ext
в Perl?
Это, как я открыть файл в Perl:Открыть файл с или без расширения
open FILE, "</file.ext";
Как открыть файл file
независимо от того, если это называется file
или file.ext
в Perl?
Вы можете использовать grep
:
use warnings;
use strict;
use Errno qw(ENOENT);
my ($file) = grep { -f $_ } qw(file file.ext)
or die $!=ENOENT;
open my $fh, '<', $file
or die "$file: $!";
Я думаю, что я бы взял аналогичный подход, но мог бы сделать это через тройной, например. 'open (my $ input, '<', -f $ file? $ file: $ file.". ext ") или die $ !; '. – Sobrique
Типичный подход заключается в передаче файла на кусок кода, который необходимо открыть файл:
sub f {
my ($filename) = @_;
open my $fh, '<', $filename or die "$!";
# do things with $fh
close $fh;
return;
}
теперь не имеет значения то, что имя файла, функция f
откроется она (при условии, что существует и у вас есть права на чтение его):
f('file');
f('file.ext');
вы также можете передать имя файла в качестве аргумента командной строки:
#!perl
# test-open.pl
use strict;
use warnings;
my $filename = shift @ARGV or die "Missing filename";
open my $fh, '<', $filename or die "$!";
теперь вы звоните test-open.pl, передавая ему имя:
perl test-open.pl file
perl test-open.pl file.ext
Могу ли я вернуть открытый файл, чтобы я мог выполнять манипуляции вне функции? Мне нужно перебирать его несколько раз. – macurie
@macurie определенно –
open
возвращает 0 в случае ошибки, так что вы можете цепи открытые звонки вместе с операторы ||
или or
.
my $fh;
open ($fh, '<', 'file') ||
open ($fh, '<', 'file.ext') ||
open ($fh, '<', $other_default_filename) ||
die "Couldn't find any acceptable file: $!";
Это может умереть с неправильным сообщением об ошибке. Например, он будет умирать с «Нет такого файла или каталога», если у вас нет прав на чтение 'file' и' file.ext' не существует. См. Мой ответ. – ikegami
Ниже будет производить сообщение об ошибке наиболее полезным:
sub open_if_exists {
my ($qfn) = @_;
my $fh;
open($fh, '<', $qfn)
and return $fh;
$!{ENOENT}
and return undef;
die("Can't open \"$qfn\": $!\n");
}
my $qfn = "file";
my $fh = open_if_exists($qfn) || open_if_exists("$qfn.ext")
or die("Can't open \"$qfn\" or \"$qfn.ext\": $!\n");
Что произойдет, если и '' file' и file.ext' существует? – Borodin