Подтвердить что ты не робот

Как я могу извлечь имя файла из пути с помощью Perl?

У меня есть переменная Perl, которую я заполняю из базы данных. Его имя $path. Мне нужно получить еще одну переменную $file, которая имеет только имя файла из пути.

Я пробовал:

$file = $path =~ s/.*\///;

Я очень новичок в Perl.

4b9b3361

Ответ 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";