Получить имя файла без расширения в Perl

Блог им. xoma 12 ноября 2010 г., 14:00

Тривиальная задача — есть имя файла, что-то типа 'Report.doc' или 'Report.pdf', необходимо получить имя файла без расширения, т.е. в нашем случае в обоих вариантах нам нужно получить строку 'Report'. Задача упрощена тем, что расширение файла содержит строго 3 символа.

Решая данную задачу на Perl у меня родились вот такие варианты:


#! /usr/bin/env  perl

use strict;
use warnings;
use 5.010;

# исходное имя файла
my $file_name = 'report.doc';

my $copy_file_name = $file_name;

# 1 substr 
substr($copy_file_name,-4) = '';

say "Name is $copy_file_name";

# 2 используя substr и index
my $name = substr($file_name,0,index($file_name,'.'));

say "Name of '$file_name' is '$name'";

# 3 используя регулярные выражения
$file_name =~ /^(.+)\.(.+)$/;

say "Name of $file_name is '$1' and ext is '$2'";

# 4 используя регулярные выражения Perl 5.010
$file_name =~ /^(?<name>.+)\.(?<ext>.+)$/;

say "Name of $file_name is '$+{name}' and ext is '$+{ext}'";


Сравнение скорости не проводилось, да и не было такой необходимости =)

Хотел поинтересоваться, какие еще возможны варианты?

Теги: Perl код файл xoma 0


Комментарии 5

tester
tester
сорь, невнимательно прочел задачу. Правильно так use File::Basename; my ($name,undef, undef) = fileparse($file_name, qr/\.[^.]*/);
OlegTar
OlegTar
$file =~ s/\.[^\.]*$//;
OlegTar
OlegTar
Вовсе не обязательно в регулярном выражении захватывать имя целиком. Можно только расширение.
xoma
xoma
Да, я знаю, просто для примера так сделал. Спасибо, за Ваш вариант!
OlegTar
OlegTar
# 2 используя substr и index my $name = substr($file_name,0,index($file_name,'.')); не сработает, если в имени файла встречается более одной точки. test.test.doc -> test Надо использовать rindex: my $name = substr($file_name,0,rindex($file_name,'.'));
Пожалуйста, авторизуйтесь или зарегистрируйтесь для комментирования!