2016-05-11 15 views
0

これは私がPerlでファイルを開く方法です:ファイルを開く

open FILE, "</file.ext"; 

私は関係なく、それはPerlでfileまたはfile.extと呼ばれていた場合のファイルfileを開くにはどうすればよいですか?

+1

をどうなりますか? – Borodin

答えて

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

私は同様のアプローチをとると思いますが、3進数で行うこともできます。 '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が開きますそれ(それが存在すると仮定すると、あなたはそれを読み取る権限を持っている):

#!perl 

# test-open.pl 
use strict; 
use warnings; 

my $filename = shift @ARGV or die "Missing filename"; 
open my $fh, '<', $filename or die "$!"; 

f('file'); 
f('file.ext'); 

あなたは、コマンドライン引数としてファイル名を渡すことができます

は今、あなたはそれをファイル名を渡し、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'が存在しない場合、 'No such file or directory'で死ぬでしょう。私の答えを見てください。 – ikegami

3

以下は、最も使用可能なエラーメッセージを生成します: `file`と`存在file.ext`両方の場合

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");