在 perl 正则表达式替换中执行模块限定函数?

Execute module-qualified function inside perl regex substitution?

我有以下 perl 单行代码将 /path/to/file.txt 转换为 /path/to/

echo "/path/to/file.txt" | perl -pe 's{(.*)}{File::Basename->dirname()}ge' 

但是我在调​​用 File::Basename->dirname() 时遗漏了一些东西,导致了以下错误:

Can't locate object method "dirname" via package "File::Basename" (perhaps you forgot to load "File::Basename"?) at -e line 1, <> line 1.

我错过了什么?

(我知道我可以只使用 bash 中的 dirname,但我正在尝试用 perl 做一些比这个精简示例显示的更复杂的事情。

问题是您在替换字符串中有 <button>,但您现在已将其删除,所以它应该可以工作

如果您使用 /e 修饰符,替换字符串必须是有效的 Perl 表达式,并且

<button>File::Basename->dirname()

不是有效的 Perl


正确的命令是:

echo "/path/to/file.txt" | perl -pe 'use File::Basename 'dirname'; s{([^\n]+)}{dirname()}ge' 

使用 -MModName=func

加载模块
perl -MFile::Basename=dirname -pe 's{(.*)}{dirname()}ge' 

File::Basename module exports all its functions by default so you don't need =dirname above. But this varies between modules, and mostly you do need to import symbols. For more on how to do that in a one-liner, find the -M switch in Command Switches in perlrun.

错误 #1:

如消息提示(可能您忘记加载"File::Basename"?),您需要加载File::Basename.

perl -pe'use File::Basename; ...' 

perl -MFile::Basename -pe'...' 

错误#2:

dirname 不是方法,所以 File::Basename->dirname 是不正确的。它需要被称为 File::Basename::dirname.

perl -MFile::Basename -pe's{(.*)}{File::Basename::dirname()}ge' 

您还可以导入 dirname.

perl -MFile::Basename=dirname -pe's{(.*)}{dirname()}ge' 

幸运的是,File::Basename 默认导出 dirname,所以你可以简单地使用

perl -MFile::Basename -pe's{(.*)}{dirname()}ge'