在 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'
我有以下 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'