Как я могу извлечь имя файла из пути с помощью Perl?
У меня есть переменная Perl, которую я заполняю из базы данных. Его имя $path
. Мне нужно получить еще одну переменную $file
, которая имеет только имя файла из пути.
Я пробовал:
$file = $path =~ s/.*\///;
Я очень новичок в Perl.
Ответы
Ответ 1
Зачем изобретать колесо? Используйте модуль File:: Basename:
use File::Basename;
...
$file = basename($path);
Почему $file=$path=~s/.*\///;
не работает?
=~
имеет более высокий precedence, чем =
So
$file = $path =~s/.*\///;
рассматривается как:
$file = ($path =~s/.*\///);
который выполняет замену в $path
и присваивает либо 1
(если происходит замена), либо ''
(если замена не происходит).
Что вы хотите:
($file = $path) =~s/.*\///;
который присваивает значение $path
$file
, а затем заменяет в $path
.
Но снова есть много проблем с этим решением:
-
Это неверно. Имя файла в системах на базе Unix (не уверен в Windows) может содержать новую строку. Но .
по умолчанию не соответствует новой строке. Поэтому вам придется использовать модификатор s
, чтобы .
также соответствовал новой строке:
($file = $path) =~s/.*\///s;
-
Самое главное, что он не переносится, поскольку предполагается, что /
- это разделитель путей, который не относится к некоторым платформам, таким как Windows (который использует \
), Mac (который использует :
). Поэтому используйте модуль и дайте ему справиться со всеми этими проблемами.
Ответ 2
use File::Basename
Посмотрите приведенную ниже ссылку для подробного описания того, как она работает:
http://p3rl.org/File::Basename
Ответ 3
Я думаю, что лучший способ сделать это -
use File::Basename;
my $file_name = basename($0);
Таким образом, переменная $file_name
будет иметь имя вашего script
Ответ 4
Path:: Class может показаться излишним при создании объектов файлов и путей dir, но он может действительно окупиться в сложных сценариях и предлагает множество бонусов, которые предотвратят спагетти, когда вы окажетесь в углу с помощью ползучести. Файл:: Spec используется в первом примере для удовольствия для решения пути.
use warnings;
use strict;
use Path::Class qw( file );
use File::Spec;
# Get the name of the current script with the procedural interface-
my $self_file = file( File::Spec->rel2abs(__FILE__) );
print
" Full path: $self_file", $/,
"Parent dir: ", $self_file->parent, $/,
" Just name: ", $self_file->basename, $/;
# OO
my $other = Path::Class::File->new("/tmp/some.weird/path-.unk#");
print "Other file: ", $other->basename, $/;
Ответ 5
$url=~/\/([^\/]+)$/;
print "Filename $1\n";