我正在尝试计算字符串中的字符,并找到一个使用tr运算符计算单个字符的简单解决方案.现在我想用从a到z的每个角色来做这个.以下解决方案不起作用,因为tr///匹配每个字符.
my @chars = ('a' .. 'z');
foreach my $c (@chars)
{
$count{$c} = ($text =~ tr/$c//);
}
Run Code Online (Sandbox Code Playgroud)
我如何正确使用char变量tr///?
tr/// 除非您将变量包装在变量中,否则它不适用于变量 eval
但有一个更好的方法来做到这一点:
$count{$_} = () = $text =~ /$_/g for 'a' .. 'z';
Run Code Online (Sandbox Code Playgroud)
对于TIMTOWTDI:
$count{$_}++ for grep /[a-z]/i, split //, $text;
Run Code Online (Sandbox Code Playgroud)
tr不支持变量插值(既不在搜索列表中,也不在替换列表中)。如果要使用变量,则必须使用eval():
$count{$c} = eval "\$text =~ tr/$c/$c/";
Run Code Online (Sandbox Code Playgroud)
也就是说,一种更有效(更安全)的方法是简单地迭代字符串中的字符并为每个字符增加计数器,例如:
my %count = map { $_ => 0 } 'a' .. 'z';
for my $char (split //, $text) {
$count{$char}++ if defined $count{$char};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2856 次 |
| 最近记录: |