String Perl:使用数组大写单词

String Perl:使用数组大写单词,string,perl,String,Perl,我正在处理所有大写字母的大块文本,将它们转换为混合大小写,并添加标点符号。然而,有一大组单词和名字我想大写,比如一周中的几天、几个月、人等等 有没有一种方法可以使用正确大写的术语数组或散列,而不是使用大量替换?因此,如果我有一个字符串“然后在星期一,我们应该看到bob和sue”将其转换为“然后在星期一,我们应该看到bob和sue”如果我的术语存储在数组或散列中 谢谢 您可以创建一个要转换的单词散列,然后如果遇到这些单词,请应用预期的转换: use strict; use warnings;

我正在处理所有大写字母的大块文本,将它们转换为混合大小写,并添加标点符号。然而,有一大组单词和名字我想大写,比如一周中的几天、几个月、人等等

有没有一种方法可以使用正确大写的术语数组或散列,而不是使用大量替换?因此,如果我有一个字符串“然后在星期一,我们应该看到bob和sue”将其转换为“然后在星期一,我们应该看到bob和sue”如果我的术语存储在数组或散列中


谢谢

您可以创建一个要转换的单词散列,然后如果遇到这些单词,请应用预期的转换:

use strict;
use warnings; 

use feature qw(say);

my %transformations = (
   monday => \&titlecase,
   bob    => \&titlecase,
   sue    => \&titlecase,
   shout  => \&uppercase,
);

while ( my $line = <$filehandle> ) {
   chomp $line;
   foreach my $word ( split /\s+/, $line ) {
      if ( my $transform = $transformations{lc $word} ) {
         $line =~ s/$word/$transform->($word)/ge;
      }
   }
   say $line;
}

sub titlecase {
   my ($s) = @_;

   return ucfirst lc $s;
}

sub uppercase {
   my ($s) = @_;

   return uc $s;
}
使用严格;
使用警告;
使用特征qw(例如);
我的%s转换=(
星期一=>\&titlecase,
bob=>\&标题框,
sue=>\&titlecase,
shout=>\&大写,
);
while(我的$line=){
chomp$行;
foreach my$word(拆分/\s+/,$line){
if(my$transform=$transformations{lc$word}){
$line=~s/$word/$transform->($word)/ge;
}
}
比如说$line;
}
亚滴定酶{
我的($s)=;
返回第一个信用证$s;
}
次大写{
我的($s)=;
返回uc$s;
}

根据需要进行调整。

谢谢你的好主意。最后我(第一次)想到了散列。这可能不是很理想,但它完成了任务:)


连接“|”之后需要一个逗号
——您已经注释掉了!如果没有
使用功能“fc”
使用v5.16
@Borodin,这将无法编译,谢谢,修复了。您也可以使用
CORE::fc
而不是使用该功能。请参阅
use feature qw( fc );  # Alternatively, "lc" is "close enough".

my @to_capitalize = qw( Monday Bob Sue );
my @abbreviations = qw( USA );
my @exceptions    = qw( iPhone );

my %words = (
   ( map { fc($_) => ucfirst(lc($_)) } @to_capitalize ),
   ( map { fc($_) => uc($_)          } @abbreviations ),
   ( map { fc($_) => $_              } @exceptions ),
);

my $pat =
   join '|',
      #map quotemeta,    # If this is needed, our use of \b is incorrect.
         keys %words;

s/\b($pat)\b/$words{fc($1)}/ig;
%capitalize = (
"usa" => "USA",
"nfl" => "NFL",
);

$row = "I live in the usa and love me some nfl.";

foreach my $key (keys %capitalize) {
    if ($row =~ $key) { 
        $row =~ s/$key/$capitalize{$key}/g;
        }
}

print $row;