对于我的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)
这样,您就不必处理丢失/错误的扩展.
检查文件名的结尾怎么样?
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)
更多信息在这里.