如何在Perl中截断特殊情况的扩展名?

时间:2011-12-02 01:58:08

标签: perl

我正在编写一个脚本,使用正则表达式截断文件的所有扩展,如下所示,但它看起来效果不好,因为这个命令确实删除了我想要的一些数据,因为它基本上会删除所有内容一个点。

我目前使用的正则表达式: -

/\..*?$/

它会删除一些像

这样的文件
b10_120.00c.current.all   --> b10_120  
abc_10.77.log.bac.temp.ls --> abc_10

但我正在寻找b10_120.00cabc_10.77

中的输出

除此之外,有没有办法打印输出,例如它只保留某些扩展名?例如,对于上述两个示例,它将显示b10_120.00c.currentabc_10.77.log。非常感谢你。

4 个答案:

答案 0 :(得分:4)

以下将删除文件扩展名:

s/\.[^.]+$//;

解释

\.与文字.匹配 [^.]+匹配不是.的每个字符 $直到字符串结尾

更新

my ($new_file_name) = ( $file_name =~ m/^( [^.]+ \. [^.]+ )/x );

解释

^锚点在字符串的开头
[^.]+匹配不是.的每个字符 \.与文字.匹配 [^.]+匹配不是.

的每个字符

测试

#!/usr/bin/env perl

use strict;
use warnings;

use Test::More 'tests' => 2;

my %file_name_map = (
    'b10_120.00c.current.all'   => 'b10_120.00c',
    'abc_10.77.log.bac.temp.ls' => 'abc_10.77',
);

sub new_file_name {
    my $file_name = shift;
    my ($new_file_name) = ( $file_name =~ m/^( [^.]+ \. [^.]+ )/x );
    return $new_file_name;
}

for my $file_name ( keys %file_name_map ) {
    is $file_name_map{$file_name}, new_file_name($file_name),
      "Got $file_name_map{$file_name}";
}

答案 1 :(得分:2)

$file =~ s/(\.[^.]+).*/$1/; # SO requires 30 chars in answer, that is stupid

答案 2 :(得分:0)

您应该使用\.作为正则表达式中的点。

另外,请详细说明如何处理文件名。

答案 3 :(得分:-1)

我建议使用这个包而不是正则表达式: http://perldoc.perl.org/File/Basename.html