如何使用Perl从路径中提取文件名?

JUA*_*UAN 15 regex string perl operator-precedence

我有一个从数据库填充的Perl变量.它的名字是$path.我需要获取另一个变量$file,它只包含路径名中的文件名.

我试过了:

$file = $path =~ s/.*\///;
Run Code Online (Sandbox Code Playgroud)

我是Perl的新手.

cod*_*ict 30

为什么重新发明轮子?使用File :: Basename模块:

use File::Basename;
...
$file = basename($path);
Run Code Online (Sandbox Code Playgroud)

为什么$file=$path=~s/.*\///;不工作?

=~具有更高的优先级=

所以

$file = $path =~s/.*\///;
Run Code Online (Sandbox Code Playgroud)

被视为:

$file = ($path =~s/.*\///);
Run Code Online (Sandbox Code Playgroud)

其中包括替换$path和分配1(如果发生替换)或''(如果没有替换).

你想要的是:

($file = $path) =~s/.*\///;
Run Code Online (Sandbox Code Playgroud)

它赋予$pathto 的值,$file然后进行替换$path.

但是这个解决方案还有很多问题:

  1. 这是不正确的.基于Unix的系统中的文件名(不确定Windows)可以包含换行符.但.默认情况下与换行符不匹配.因此,您必须使用s修饰符,以便.匹配换行符:

    ($file = $path) =~s/.*\///s;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 最重要的是,它不是可移植的,因为它假定/是路径分隔符,而某些平台(如Windows(使用\),Mac(使用:))的情况并非如此.因此,请使用该模块,让它为您处理所有这些问题.