如何使用Perl检查文件的扩展名?

Laz*_*zer 7 perl file

对于我的perl脚本,文件作为争论传递.该文件可以是.txt文件或.zip包含该.txt文件的文件.

我想编写看起来像这样的代码

if ($file is a zip) {

    unzip $file
    $file =~ s/zip$/txt/;
}
Run Code Online (Sandbox Code Playgroud)

检查扩展的一种方法是进行拆分.,然后匹配数组中的最后一个结果(通过拆分返回).

有更好的方法吗?

Dav*_*oss 13

您可以使用File :: Basename.

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

use File::Basename;

my @exts = qw(.txt .zip);

while (my $file = <DATA>) {
  chomp $file;
  my ($name, $dir, $ext) = fileparse($file, @exts);

  given ($ext) {
    when ('.txt') {
      say "$file is a text file";
    }
    when ('.zip') {
      say "$file is a zip file";
    }
    default {
      say "$file is an unknown file type";
    }
  }
}

__DATA__
file.txt
file.zip
file.pl
Run Code Online (Sandbox Code Playgroud)

运行这个给出:

$ ./files 
file.txt is a text file
file.zip is a zip file
file.pl is an unknown file type
Run Code Online (Sandbox Code Playgroud)


Ala*_*avi 12

另一种解决方案是利用File::Type它来确定二进制文件的类型.

use strict;
use warnings;

use File::Type;

my $file      = '/path/to/file.ext';
my $ft        = File::Type->new();
my $file_type = $ft->mime_type($file);

if ( $file_type eq 'application/octet-stream' ) {
    # possibly a text file
}
elsif ( $file_type eq 'application/zip' ) {
    # file is a zip archive
}
Run Code Online (Sandbox Code Playgroud)

这样,您就不必处理丢失/错误的扩展.

  • `File :: Type`在这里工作,但与[`File :: LibMagic`](http://p3rl.org/File :::LibMagic)相比,一般来说这是一项非常糟糕的工作. (2认同)

eum*_*iro 8

检查文件名的结尾怎么样?

if ($file =~ /\.zip$/i) {
Run Code Online (Sandbox Code Playgroud)

然后:

use strict;
use Archive::Extract;

if ($file =~ /\.zip$/i) {
    my $ae = Archive::Extract->new(archive => $file);
    my $ok = $ae->extract();
    my $files = $ae->files();
}
Run Code Online (Sandbox Code Playgroud)

更多信息在这里.