打开带或不带扩展名的文件

时间:2016-05-11 13:51:44

标签: perl

这是我在Perl中打开文件的方式:

open FILE, "</file.ext";

如何在文件file中打开它,无论它在Perl中被称为file还是file.ext

4 个答案:

答案 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