Как урезать расширение для особого случая в Perl? - PullRequest
0 голосов
/ 02 декабря 2011

Я работаю над сценарием для усечения всех расширений для файла с использованием регулярного выражения, как показано ниже, но кажется, что он не работает должным образом, так как эта команда удаляет некоторые данные, которые я хочу, поскольку она в основном удаляет все, когда видит точка.

Регулярное выражение, которое я использую сейчас: -

/\..*?$/

Было бы удалить некоторые файлы, такие как

b10_120.00c.current.all   --> b10_120  
abc_10.77.log.bac.temp.ls --> abc_10

но я ищу вывод в b10_120.00c и abc_10.77

Кроме этого, есть ли способ распечатать вывод, такой как он сохраняет только определенное расширение? Например, в приведенных выше 2 примерах отображаются b10_120.00c.current и abc_10.77.log. Большое спасибо.

Ответы [ 4 ]

4 голосов
/ 02 декабря 2011

Следующие файлы удаляют расширения имени файла:

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}";
}
2 голосов
/ 02 декабря 2011
$file =~ s/(\.[^.]+).*/$1/; # SO requires 30 chars in answer, that is stupid
0 голосов
/ 02 декабря 2011

Вместо регулярного выражения я бы предложил использовать этот пакет: http://perldoc.perl.org/File/Basename.html

0 голосов
/ 02 декабря 2011

Вы должны использовать \. для точки в регулярном выражении.

Также, пожалуйста, объясните более подробно, как вы хотите обработать имя файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...