Как я могу извлечь имя файла из пути, используя Perl? - PullRequest
15 голосов
/ 22 января 2011

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

Я пытался:

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

Я очень плохо знаком с Perl.

Ответы [ 5 ]

29 голосов
/ 22 января 2011

Зачем изобретать велосипед? Используйте модуль File :: Basename :

use File::Basename;
...
$file = basename($path);

Почему $file=$path=~s/.*\///; не работает?

=~ имеет более высокий приоритет , чем =

Итак

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

трактуется как:

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

, который выполняет замену в $path и присваивает 1 (если замена происходит) или '' (если замена не происходит).

То, что вы хотите:

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

, который присваивает значение $path $file, а затем выполняет замену в $path.

Но опять же есть много проблем с этим решением:

  1. Это неверно. Имя файла в Unix-системах (не уверенных в Windows) может содержать символ новой строки. Но . по умолчанию не соответствует символу новой строки. Поэтому вам придется использовать модификатор s, чтобы . также соответствовал символу новой строки:

    ($file = $path) =~s/.*\///s;
    
  2. Наиболее важно, что он не переносим, ​​поскольку предполагается, что / - это разделитель пути, который не имеет место на некоторых платформах, таких как Windows (которая использует \), Mac (которая использует :). Так что используйте модуль и позвольте ему решать все эти проблемы за вас.

3 голосов
/ 22 января 2011
use File::Basename 

Проверьте по ссылке ниже подробное описание того, как это работает:

http://p3rl.org/File::Basename

2 голосов
/ 31 января 2017

Я думаю, что лучший способ сделать это -

use File::Basename;

my $file_name = basename($0);

Так что переменная $file_name будет иметь имя вашего скрипта

1 голос
/ 09 июля 2016
$url=~/\/([^\/]+)$/;
print "Filename $1\n";
1 голос
/ 22 января 2011

Path :: Class поначалу может показаться излишним - создание объектов из файлов и путей dir - но это действительно может окупиться в сложных сценариях и предлагает множество бонусов, которые предотвратят спагетти при поддержке в угол по объему ползучести. File :: 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, $/;
...