2016-05-11 6 views

ответ

4

Вы можете использовать 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: $!"; 
+0

Я думаю, что я бы взял аналогичный подход, но мог бы сделать это через тройной, например. 'open (my $ input, '<', -f $ file? $ file: $ file.". ext ") или die $ !; '. – Sobrique

0

Типичный подход заключается в передаче файла на кусок кода, который необходимо открыть файл:

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 
+0

Могу ли я вернуть открытый файл, чтобы я мог выполнять манипуляции вне функции? Мне нужно перебирать его несколько раз. – macurie

+0

@macurie определенно –

1

open возвращает 0 в случае ошибки, так что вы можете цепи открытые звонки вместе с операторы || или or.

my $fh; 
open ($fh, '<', 'file') || 
    open ($fh, '<', 'file.ext') || 
    open ($fh, '<', $other_default_filename) || 
    die "Couldn't find any acceptable file: $!"; 
+0

Это может умереть с неправильным сообщением об ошибке. Например, он будет умирать с «Нет такого файла или каталога», если у вас нет прав на чтение 'file' и' file.ext' не существует. См. Мой ответ. – ikegami

3

Ниже будет производить сообщение об ошибке наиболее полезным:

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"); 
Смежные вопросы