我正在尝试在Perl中编写一个与文件路径的特定部分匹配的正则表达式。
输入字符串:
/usr/local/bin/mybinary
输出必须匹配:
/usr/local/bin
我的正则表达式是:
(\ /.*\ /)
匹配/usr/local/bin/
,但应删除/
之后的bin
。
答案 0 :(得分:4)
File::Basename可以为您完成此操作:
use warnings;
use strict;
use File::Basename qw(dirname);
my $in = '/usr/local/bin/mybinary';
my $out = dirname($in);
print "$out\n";
__END__
/usr/local/bin
答案 1 :(得分:2)
如果您正在摆弄路径,强烈建议您使用Path::Tiny
。它有几乎所有你想要的方法来检索绝对/相对路径名,基本名称和许多其他方法,包括父...
use Path::Tiny;
my $path = path('/usr/local/bin/mybinary');
say $path->parent; # OUTPUT: '/usr/local/bin'
更新:老人建议
我知道你说(在你对toolic
的答案的评论中)你正在学习正则表达式,并且想要使用它们而不是函数。学习正则表达式的一部分也在学习它们不适合的地方,或者对问题有点过分。在这种情况下,从index
0到'{'的rindex
(右索引)的路径的子字符串将更有效。
my $string = '/usr/local/bin/mybinary';
say substr($string, 0, rindex($string, '/') ); # OUTPUT: '/usr/local/bin'
# or get the child
say substr($string, rindex($string, '/') + 1); # OUTPUT: 'mybinary'
许多perl初学者使用正则表达式捕获或split
使用substr
以及index
,rindex
和/或{可以更有效地解决问题{1}}。值得学习这些字符串操作方法,这样你就可以更好地决定何时使用正则表达式。
答案 2 :(得分:1)