在Perl中统计字符串中非空白字符的个数



我正试图弄清楚如何计数字符串中的任何和所有非空白字符,以便在下面的示例中我将得到4的输出。

my $str = 'A b C $'; 
my $cnt =~ /S/g;  
print "Char Count: $cntn";
是否有一个Perl快捷方式来计算字符串中的匹配数?没有回答我的问题。
perl -e 'my $str = "A b C"; my $cnt = () = $str =~ /./gi;  print "Chs: $cntn";'
Chs: 0

有人一直想说这个问题是这个问题的重复:是否有一个Perl快捷方式来计算字符串中的匹配次数?

然而,另一个问题是关于如何匹配一个特定的字符,在他们的情况下,我相信它是一个点。我看了很多其他的例子,它们试图匹配一个特定的字符,但不能让它们匹配除空白以外的所有字符。

这没有回答我的问题。

$string = "ThisXlineXhasXsomeXx'sXinXit";
$count = ($string =~ tr/X//);
print "There are $count X characters in the string";

这个问题:S, W, D在正则表达式中代表什么?仅仅定义了各种Perl通配符操作符——其中一个(S操作符)我试图在最初的问题中使用,但无济于事。但是,它没有演示如何实际使用这些操作符之一来获取字符串中所有非空白字符的计数。

From perlfaq4(如何计算字符串中子字符串的出现次数?):

另一个版本在列表上下文中使用全局匹配,然后分配将结果转换为标量,生成匹配次数的计数。

您还可以从命令行查询Perl文档:

perldoc -q count

use warnings;
use strict;
my $str = 'A b C $'; 
my $cnt = () = $str =~ /S/g;
print "Char Count: $cntn";
require 5.014;
use feature qw( unicode_strings );
my $count = () = $str =~ /S/g;

require 5.014;
use feature qw( unicode_strings );
my $count = 0;
++$count while $str =~ /S/g;

# Count non-whitespace characters.
my $count = $str =~ tr/x{0009}x{000A}x{000B}x{000C}x{000D}x{0020}x{0085}x{00A0}x{1680}x{2000}x{2001}x{2002}x{2003}x{2004}x{2005}x{2006}x{2007}x{2008}x{2009}x{200A}x{2028}x{2029}x{202F}x{205F}x{3000}//c;
  • 第一种方法会占用大量内存。它为每个非空白字符创建一个标量。

  • 第二个没有。我不确定它是快还是慢。

  • 第三个应该快得多,但你不能使用预构建的角色类。

  • s/S需要
  • require 5.014; use feature qw( unicode_strings );(或仅use 5.014;)才能正确处理U+85 NEL和U+A0 NBSP。(更高版本也可以。)否则,它将"随机"。可视为空格或非空格

    use feature qw( say );
    { local $_ = "abcx{0085}x{00A0}x{2000}"; say scalar( () = /S/g ); }  # 3
    { local $_ = "abcx{0085}";                 say scalar( () = /S/g ); }  # 4?!
    { local $_ = "abcx{00A0}";                 say scalar( () = /S/g ); }  # 4?!
    { local $_ = "abcx{2000}";                 say scalar( () = /S/g ); }  # 3
    

最新更新