这是我在Perl中打开文件的方式:
open FILE, "</file.ext";
如何在文件file
中打开它,无论它在Perl中被称为file
还是file.ext
?
答案 0 :(得分: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: $!";
答案 1 :(得分: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");
答案 2 :(得分: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: $!";
答案 3 :(得分: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