これを行う最も明確な方法は、(修飾子を使用して) 2 段階で評価される/e
置換を行うことです。
以下のコードでは、外側の置換により、境界ハイフンを含むアーティスト名が選択され、置換されます。
内側のものは$1
- アーティスト名 - を取り、スペース以外の文字のすべてのサブシーケンスを、最初に小文字にしlc
て次に大文字にした同じ文字列に置き換えucfirst
ます。
現状では、プログラムは前後の名前を出力します。#
名前を変更するには、名前の行から を削除します。
use strict;
use warnings;
my @data = (
'05 - JEAN BAGUETTE - Honi soit qui mal y pense.mp3',
'07 - SIGNORE AL FORNO - Pazzi sono tutti i calciatori.mp3',
);
for my $file (@data) {
(my $new = $file) =~ s{(-[^-]+-)}{
(my $artist = $1) =~ s/(\S+)/ucfirst lc $1/eg;
$artist;
}e;
print "$file\n";
print "$new\n";
print "\n";
# rename $file, $new;
}
出力
05 - JEAN BAGUETTE - Honi soit qui mal y pense.mp3
05 - Jean Baguette - Honi soit qui mal y pense.mp3
07 - SIGNORE AL FORNO - Pazzi sono tutti i calciatori.mp3
07 - Signore Al Forno - Pazzi sono tutti i calciatori.mp3
アップデート
別の方法として、ファイル名をハイフンで分割し、2 番目の部分を編集して結合し直すこともできます。
上からのメインループは
for my $file (@data) {
my @file = split /-/, $file;
$file[1] =~ s/(\S+)/ucfirst lc $1/eg;
my $new = join '-', @file;
print "$file\n";
print "$new\n";
print "\n";
# rename $file, $new;
}
機能と出力は変更されていません。
更新 2
/-.*?-/ を使用して実験し、次に substr($_, $-[0], $+[0]) を =~ s/// の左辺値として使用しましたが、残念ながらうまくいきませんでした
それは私がそれを実験しなければならなかったとても素晴らしいアイデアのように思えました.
とは文字列へのオフセットであるため、への呼び出しsubstr
は間違っています。の 3 番目のパラメーターは文字列の長さでなければならないため、次のように記述する必要があります。$-[0]
$+[0]
substr
substr($_, $-[0], $+[0] - $-[0])
このコードは正常に機能し、以前と同じ結果が得られます
for my $file (@data) {
next unless $file =~ /-[^-]+-/;
my $new = $file;
substr($new, $-[0], $+[0]-$-[0]) =~ s/(\S+)/ucfirst lc $1/eg;
print "$file\n";
print "$new\n";
print "\n";
# rename $file, $new;
}