$filename =~ s,^_\d+-(.*?)--(.*?)_(.*?)_$,\u\1 - \u\2 (\u\3),;
我的 Perl 解释器(使用严格和警告)说最好这样写:
$filename =~ s,^_\d+-(.*?)--(.*?)_(.*?)_$,\u$1 - \u$2 (\u$3),;
第一个可能是因为它的味道更sedish!(当然,两个版本的工作原理都是一样的。)
解释(根据stema的要求):
$filename =~ s/
^ # matches the start of the line
_\d+- # matches an underscore, one or more digits and a hypen minus
(.*?)-- # matches (non-greedyly) anything before two consecutive hypen-minus
# and captures the entire match (as the first capture group)
(.*?)_ # matches (non-greedyly) anything before a single underscore and
# captures the entire match (as the second capture group)
(.*?)_ # does the same as the one before (but captures the match as the
# third capture group obviously)
$ # matches the end of the line
/\u$1 - \u$2 (\u$3)/x;
替换规范只是告诉 Perl 插入从 1 到 3的\u${1..3}
捕获组,并且它们的第一个字符大写。如果您想将整个匹配(在捕获的组中)设为大写,则必须\U
改用。
x标志打开详细模式,它告诉 Perl 解释器我们要使用#注释,所以它会忽略这些(以及正则表达式中的任何空格 - 所以如果你想匹配一个空格,你必须使用\s
或者\
)。不幸的是,我不知道如何告诉 Perl 忽略 * replacement* 规范中的空白 - 这就是我将其写在一行的原因。
(另请注意,我已将s
终止符从更改,
为/
- 如果我使用,
打开详细模式的 Perl 对我咆哮......不完全确定为什么。)