$filename =~ s,^_\d+-(.*?)--(.*?)_(.*?)_$,\u\1 - \u\2 (\u\3),;
私の Perl インタープリター (strict と warnings を使用) によると、これは次のように記述したほうがよいとのことです。
$filename =~ s,^_\d+-(.*?)--(.*?)_(.*?)_$,\u$1 - \u$2 (\u$3),;
最初のものは、おそらくその味のためにもっとセディッシュです! (もちろん、どちらのバージョンもまったく同じように動作します。)
説明 ( 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;
in replacement 指定は\u${1..3}
、最初の文字を大文字にして 1 から 3 までのキャプチャ グループを挿入するように Perl に指示するだけです。(キャプチャされたグループ内の) 一致全体を大文字にしたい場合は、\U
代わりに使用する必要がありました。
xフラグは冗長モードをオンにし、 #コメントを使用したいことを Perl インタープリターに伝えるので、これら (および正規表現内のすべての空白 - したがって、スペースに一致させたい場合は、またはのいずれ\s
かを使用する必要があります) \
)。残念ながら、* replacement* 仕様で空白を無視するように Perl に指示する方法がわかりませんでした。これが、1 行で記述した理由です。
s
(また、ターミネータを から,
に変更したことにも注意してください-詳細モードをオンにして/
使用すると、Perl は私に吠えました ... 正確な理由はわかりません。),