如何在不将计数显式分配给变量的情况下计算字符串中字符的出现次数,在perl中

how to count occurrences of a character in a string without assigning the count explicitly to a variable, in perl

我想报告某个字符在字符串中出现的次数。 感谢 ,下面的第一部分工作得很好。

#!/usr/bin/env perl
use strict; use warnings;
my $string='dog
#
####
pig horse';
# 
print join('','# occurs ',my$dummy=()=$string=~/[#]/g,' times in',"\n",$string,"\n",);

# the following yields no count at all:
print join('','# occurs ',()=$string=~/[#]/g,' times in',"\n",$string,"\n",);

有没有办法消除 $dummy 变量看似无端的声明?我想直接在 join 中使用那个整数 没有先声明一个变量来获取值。

那个把戏

$dummy = () = $string =~ /[#]/g

有效是因为整个赋值表达式

() = EXPR

本身在一个标量上下文中,被分配给一个标量 ($dummy),所以它 returns EXPR [=52= 的潜在列表的长度](它在列表上下文中)。

所以在它上面强加标量上下文

say join('', '# occurs ', scalar( () = $string =~ /#/g ),' times');

为了便于阅读,我缩短了字符串,并使用 say 而不是 print ... "\n"

有关 () = EXPR 及其上下文以及其中链接的更多信息,请参阅

不确定这是否真的更漂亮,但它满足了要求。

但如果你真的总是只想要一个字符的计数,那么 tr 做得更好

print join('', '# occurs ', $string =~ tr/#//,' times in',"\n",$string,"\n",);

如果真的只是打印,那么就没有必要用 join '' 形成一个字符串,因为 print 需要一个列表并有效地连接起来元素之间没有任何东西,所以加入它们

say '# occurs ', scalar( () = $string =~ /#/g ), " times in\n", $string;

或者,对于单个字符

say '# occurs ', $string =~ tr/#//, ' times in', "\n", $string;

(但我认为打印只是这个问题的一个例子,你真的需要一个字符串...)