我是Perl的新手,为了我的一份作业,我提出了这样的解决方案:
#wordcount.pl FILE
#
#if no filename is given, print help and exit
if (length($ARGV[0]) < 1)
{
print "Usage is : words.pl word filename\n";
exit;
}
my $file = $ARGV[0]; #filename given in commandline
open(FILE, $file); #open the mentioned filename
while(<FILE>) #continue reading until the file ends
{
chomp;
tr/A-Z/a-z/; #convert all upper case words to lower case
tr/.,:;!?"(){}//d; #remove some common punctuation symbols
#We are creating a hash with the word as the key.
#Each time a word is encountered, its hash is incremented by 1.
#If the count for a word is 1, it is a new distinct word.
#We keep track of the number of words parsed so far.
#We also keep track of the no. of words of a particular length.
foreach $wd (split)
{
$count{$wd}++;
if ($count{$wd} == 1)
{
$dcount++;
}
$wcount++;
$lcount{length($wd)}++;
}
}
#To print the distinct words and their frequency,
#we iterate over the hash containing the words and their count.
print "\nThe words and their frequency in the text is:\n";
foreach $w (sort keys%count)
{
print "$w : $count{$w}\n";
}
#For the word length and frequency we use the word length hash
print "The word length and frequency in the given text is:\n";
foreach $w (sort keys%lcount)
{
print "$w : $lcount{$w}\n";
}
print "There are $wcount words in the file.\n";
print "There are $dcount distinct words in the file.\n";
$ttratio = ($dcount/$wcount)*100; #Calculating the type-token ratio.
print "The type-token ratio of the file is $ttratio.\n";
Run Code Online (Sandbox Code Playgroud)
我在评论中提到了它的作用.实际上我必须从给定的文本文件中找到单词count.上述程序的输出如下:
The words and their frequency in the text is:
1949 : 1
a : 1
adopt : 1
all : 2
among : 1
and : 8
assembly : 1
assuring : 1
belief : 1
citizens : 1
constituent : 1
constitute : 1
.
.
.
The word length and frequency in the given text is:
1 : 1
10 : 5
11 : 2
12 : 2
2 : 15
3 : 18
There are 85 words in the file.
There are 61 distinct words in the file.
The type-token ratio of the file is 71.7647058823529.
Run Code Online (Sandbox Code Playgroud)
即使在谷歌的帮助下,我也能找到我作业的解决方案.但是我认为使用Perl的真正功能将会有一个更小巧简洁的代码.任何人都可以用更少的代码行给我一个Perl的解决方案吗?
以下是一些建议:
包括use strict和use warnings你的Perl脚本.
您的参数验证不测试它应该测试的内容:(1)是否正好有1个项目@ARGV,以及(2)该项目是否是有效的文件名.
尽管每条规则都有例外,但通常最好将返回值分配给<>命名变量,而不是依赖于$_.如果循环内的代码可能需要使用Perl的结构之一也依靠这是尤其如此$_(例如map,grep或定位后for循环)
while (my $line = <>){
...
}
Run Code Online (Sandbox Code Playgroud)Perl为lc小写字符串提供了内置函数().
您正在线读取循环内执行不必要的计算.如果您只是建立一个单词的计数,您将获得所需的所有信息.还要注意的是Perl提供了一个班轮形式对大多数其控制结构的(for,while,if等),如下图所示.
while (my $line = <>){
...
$words{$_} ++ for split /\s+/, $line;
}
Run Code Online (Sandbox Code Playgroud)然后,您可以使用单词tallies来计算您需要的其他信息.例如,唯一字的数量简单地是散列中的键的数量,并且字的总数是散列值的总和.
字长的分布可以这样计算:
my %lengths;
$lengths{length $_} += $words{$_} for keys %words;
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
519 次 |
| 最近记录: |