2010-09-12 126 views

回答

7

您可以使用dirname功能从File::Basename

dirname($path) eq '/this/is/my/dir/name' or warn "No match"; 

UPD:如果你喜欢使用正则表达式:

my $dirname = '/this/is/my/dir/name'; 
$path =~ m|^$dirname/[^/]+/?$| or warn "No match"; 
+0

+1谢谢,这个工程,但我想要一个正则表达式(我用这一堆其他测试)。 – 2010-09-12 11:54:32

+3

@David:正则表达式不是这里最好的选择 - File :: Basename是为了处理文件名解析中的混乱边缘情况而编写的。应该没有理由不能将其与其他测试结合使用。 – Ether 2010-09-12 16:44:18

3

斜杠存在问题的默认分隔符,你风与leaning toothpick problem。幸运的是,Perl 5允许您选择自己的分隔符,如果您使用一般形式:m//。既然你想整个字符串,而不只是一个子串的匹配,你将要使用指定start of string (^) and end of string ($)主播:

if ($dirname =~ m{^/this/is/my/dir/name/anything$}) { 
} 

注:^$锚由/m modifier(他们改变意味着开始影响和行结束)。如果您打算使用/m修饰符,则可能需要使用\A (start of string) and \Z (end of string or before a newline at the end of the string) or \z (end of string) assertions

+0

+1谢谢,这很有用!我明白'm'后的表达式可以用'{}'或'||'或'//'括起来吗? – 2010-09-12 13:46:59

+0

@大卫B:是的。不记得官方说明,但[这个也解释](http://perldoc.perl.org/perlop.html#Gory-details-of-parsing-quoted-constructs)。 – Dummy00001 2010-09-12 13:59:58

+1

@David B在Perl 5中,您可以选择任何分隔符,但可以使用空格字符。有四个包围分隔符集:'[]','{}','()'和'<>'。在所有其他情况下,您可以使用这种'm#regex#'或#s#regex#string#'这样的字符。分隔符'''也是特殊的。它将构造变成它自己的非插值版本。 – 2010-09-12 14:22:46

相关问题