试图分手
#!/usr/bin/perl -w
具有以下代码
use strict;
use warnings;
my %words;
while (my $line = <>)
{
foreach my $word (split /:|,\s*|\/|!|\#|-/, $line)
{
$words{$word}++;
}
}
foreach my $word (keys %words)
{
print "$word: $words{$word}\n";
}
有没有更简单的方法来使split命令仅在单词,数字和下划线处分开?而不是设置所有这些定界符。
尝试获取输出
usr: 1
bin: 1
perl: 1
答案 0 :(得分:6)
不要拆分,提取。
++$words{$_} for $line =~ /\w+/g;
答案 1 :(得分:2)
您还可以使用split和取反的单词@DanielWagner says:
foreach my $word (split /\W+/, $line) {
$words{$word}++;
}
但是请注意,由于您的字符串以非单词字符开头,因此它将返回的第一个单词是字符串开头的空字符串。
character class是完成此任务的另一个工具(但比代码和文件名更适合散文使用),它使用Unicode规则来确定单词的开始和结束位置,并考虑了撇号等单词( can't
)。要利用此功能,您首先需要将输入拆分为包含单词和非单词的列表,然后找到单词(最简单的方法可能是使用至少包含一个单词字符的任何元素):
foreach my $word (grep { m/\w/ } split /\b{wb}/, $line) {
$words{$word}++;
}
\b{wb}
正则表达式序列需要Perl 5.24 +。