我的压缩文件名为:
filename1.csv.Z
filename2.csv.gz
我有用于最后扩展名的正则表达式:
my ($ext) = $file =~ /(\.[^.]+)$/;
现在,我想获取“原始文件名”,而不包含.Z或.gz。 filename1.csv,filename2.csv
我尝试在下面使用类似expresion的方法,但是不起作用...
my ($output) = $file =~ /.+?(?=(([^.]+)$))/;
有人会帮我吗?
答案 0 :(得分:6)
了解您的标准库。参见File::Basename:
use File::Basename qw(basename);
for my $fullname (qw(filename1.csv.Z filename2.csv.gz)) {
my $basename = basename $fullname, qw(.Z .gz);
}
__END__
filename1.csv
filename2.csv
答案 1 :(得分:0)
在模式.+?(?=[^.]+$)
中,您断言右边的直接是1+乘以一个点,然后是字符串的结尾。
该断言在多个地方可能是正确的,并且还将包括匹配点本身。
例如在filename2.csv.gz
中将与filename2.csv.
和g
匹配的
如果只想获取示例数据中文件名的匹配项,则可以在正向前行中添加点:
.+(?=\.[^.]+$)
或者使用捕获组和匹配项来代替前瞻:
(.+)\.[^.]+$
例如
my $line = "filename1.csv.Z";
my ($output) = $line =~ m/(.+)\.[^.]+$/;
print $output;
# filename1.csv