Получить оригинальное имя файла из архива - PullRequest
1 голос
/ 18 октября 2019

У меня есть заархивированные имена файлов, такие как:

filename1.csv.Z
filename2.csv.gz

У меня есть выражение регулярного выражения для получения последнего расширения:

my ($ext) = $file =~ /(\.[^.]+)$/;

Теперь я хотел бы получить «оригинальное имя файла»,без .Z или .gz, например. filename1.csv, filename2.csv

Я пытался использовать что-то вроде выражения ниже, но не работает ...

my ($output) = $file =~ /.+?(?=(([^.]+)$))/;

Кто-нибудь может мне помочь?

Ответы [ 2 ]

6 голосов
/ 18 октября 2019

Знай свою стандартную библиотеку. См. Файл :: Базовое имя :

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
0 голосов
/ 18 октября 2019

В вашем паттерне .+?(?=[^.]+$) вы утверждаете, что прямо справа в 1+ раз не точка, за которой следует конец строки.

Это утверждение может быть верным в нескольких местах и ​​также будет включать в себясоответствует самой точке.

Например, в filename2.csv.gz, который будет соответствовать filename2.csv. и g

Если вы хотите получить совпадение только с именем файла в данных примера, вы можете добавить точку вположительный взгляд:

.+(?=\.[^.]+$)

Regex demo

Или используйте группу захвата и совпадение вместо заголовка:

(.+)\.[^.]+$

Regex demo | Perl demo

Например

my $line = "filename1.csv.Z";
my ($output) = $line =~ m/(.+)\.[^.]+$/;
print $output;

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