如何在Perl中将部分子串改为混合大小写
Perl重命名实用程序在日常文件工作中表现非常出色,特别是在我不时检查我的MP3集合时.
有些人有一种可怕的习惯,就是总是将艺术家的名字大写,就像这样 03 - ARTIST NAME - Song Title.mp3 我希望将其重命名为一个更加平静的混合案例,就像这样 03 - Artist Name - Song Title.mp3 但是,它也应该以智能的方式完成. 可能有法语或意大利语标题,如: 05 - JEAN BAGUETTE - Honi soit qui mal y pense.mp3 要么 07 - SIGNORE AL FORNO - Pazzi sono tutti i calciatori.mp3 因此,我不希望这些变成混合的情况 – 只有艺术家的一部分. 一种没有用的方法是 rename 's/(d{1,2} - )([A-Z ]+)([sS]+)/$1lc($2)$3/' filename 无论如何我都会发布它,因为它总能让你更好地了解我正在尝试做什么. 我也尝试用一个临时变量替换$2(因为我不允许更改$2,因为它是只读的)并在打印出结果之前执行lc(),但是我没有成功.但无论如何,我是一个Perl初学者. 解决方法
我知道这样做的最清楚的方法是进行两阶段评估(使用/ 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 "$filen"; print "$newn"; 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 更新 您可能喜欢的另一种方法是在连字符上拆分文件名,编辑第二部分并将它们连接在一起. 从上面的主循环变为 for my $file (@data) { my @file = split /-/,$file; $file[1] =~ s/(S+)/ucfirst lc $1/eg; my $new = join '-',@file; print "$filen"; print "$newn"; print "n"; # rename $file,$new; } 功能和输出没有变化. 更新2
这似乎是一个很好的想法,我不得不尝试它. 你对substr的调用是错误的,因为$ – [0]和$[0]是字符串的偏移量. substr的第三个参数必须是字符串长度,所以你需要写substr($_,$ – [0],$[0] – $ – [0]) 此代码工作正常,并再次产生与以前相同的结果 for my $file (@data) { next unless $file =~ /-[^-]+-/; my $new = $file; substr($new,$+[0]-$-[0]) =~ s/(S+)/ucfirst lc $1/eg; print "$filen"; print "$newn"; print "n"; # rename $file,$new; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |