做了很多搜索,没有什么我想要的。 Perl noob在这里。
我的文本文件已经整齐地组织成数据行。说我感兴趣的两个字符串是“你好”和“再见”。我想编写一个快速的Perl脚本,它将查看第一行并计算“hello”和“goodbye”出现的次数。然后它将转到下一行并执行计数,添加到先前的计数。因此,在脚本结束时,我可以打印文件中每个字符串的总计数。逐行方法很重要的原因是因为我想使用几个计数,所以我可以打印两个单词在同一行中的次数,一行只包含其中一个单词的次数而不是另外,一行包含“hello”一次但多次“goodbye”等的次数等。真的是关于在一行上找到每个条件的次数,而不是整个文档中出现的次数。< / p>
到目前为止,我在想:
#!/usr/bin/perl
use strict; use warnings;
die etc (saving time by not including it here)
my $word_a = "hello";
my $word_b = "goodbye";
my $single_both = 0; # Number of lines where both words appear only once.
my $unique_hello = 0; # Number of lines where only hello appears, goodbye doesn't.
my $unique_goodbye = 0; # Number of lines where goodbye appears, hello doesn't.
my $one_hello_multiple_goodbye = 0; # Number of lines where hello appears once and goodbye appears multiple times.
my $one_goodbye_multiple_hello = 0; # Number of lines where goodbye appears once and hello appears multiple times.
my $multiple_both = 0; = # Number of lines where goodbye and hello appear multiple times.
while (my $line = <>) {
Magic happens here
};
# then the results for each of those variables can be printed at the end.
正如我所说,我是一个菜鸟。我对如何计算每一行中的事件感到困惑。即使我知道我确信我可以找出上面列出的所有不同条件。我应该使用数组吗?哈希?或者考虑到我想要的东西,我是在完全错误的方向上接近这个。我需要计算具有不同条件的行数我在这些变量之后列为注释。任何帮助都非常感谢!
答案 0 :(得分:6)
您可以通过正则表达式计算某些单词的出现次数,例如$hello = () = $line =~ /hello/g;
在hello
How it works?
$line
次
perl -n -E '$hello = () = /hello/g; $goodbye = () = /goodbye/g; say "line $.: hello - $hello, goodbye - $goodbye"; $hello_total += $hello; $goodbye_total += $goodbye;}{say "total: hello - $hello_total, goodbye - $goodbye_total";' input.txt
某些文件的输出:
line 1: hello - 0, goodbye - 0
line 2: hello - 1, goodbye - 0
line 3: hello - 1, goodbye - 1
line 4: hello - 3, goodbye - 0
line 5: hello - 0, goodbye - 0
line 6: hello - 1, goodbye - 1
line 7: hello - 0, goodbye - 0
total: hello - 6, goodbye - 2
答案 1 :(得分:0)
Perl有一个绑定运算符=~
,用于测试字符串是否与模式匹配。您可以将它与两个if语句结合使用,以从所有行中提取计数:
# only gathers counts
while (my $line = <STDIN>) {
$hello_cnt++ if $line =~ /hello/;
$goobye_cnt++ if $line =~ /goodbye/;
}
但似乎您想逐行推断您的输入,并且可以维护所有这些变量:$unique_hello
,$unique_goodbye
等...但这对我来说似乎是一项额外的工作,你可以做的就是哈希到总计数:
my %seen;
while (my $line = <STDIN>) {
chomp $line; # remove trailing \n
map {
$seen{lc $_}++;
} split /\s+/, $line; # split on whitespace
}
现在你有了这种结构的哈希:
{
word1 => cnt1,
word2 => cnt2,
etc ...
}
现在你可以打印总数:
print "Hello seen " . $seen{hello} . " times";
# etc ...
我为你做了逐行分析,希望这是一个很好的起点。