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.
但是这个解决方案还有很多问题:
这是不正确的.基于Unix的系统中的文件名(不确定Windows)可以包含换行符.但.默认情况下与换行符不匹配.因此,您必须使用s修饰符,以便.匹配换行符:
($file = $path) =~s/.*\///s;
Run Code Online (Sandbox Code Playgroud)最重要的是,它不是可移植的,因为它假定/是路径分隔符,而某些平台(如Windows(使用\),Mac(使用:))的情况并非如此.因此,请使用该模块,让它为您处理所有这些问题.