1

たくさんの検索を行いましたが、私が望んでいたものは何もありませんでした。Perl初心者はこちら。

私は、データ行にきちんと整理されたテキスト ファイルを既に持っています。私が興味を持っている 2 つの文字列は、"hello" と "goodbye" だとします。最初の行を見て、「こんにちは」と「さようなら」が何回出現するかをカウントする簡単な Perl スクリプトを書きたいと思います。次に、次の行に移動してカウントを行い、以前のカウントに追加します。したがって、スクリプトの最後までに、ファイル内の各文字列の合計カウント数を出力できます。行ごとのアプローチが重要な理由は、いくつかのカウントを使用して、両方の単語が同じ行にある回数を出力できるようにするためです。その他、行に「こんにちは」が1回含まれているが「さようなら」が複数回含まれている回数など。

これまでのところ、私は考えています:

#!/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.

おっしゃる通り、私は初心者です。各行の出現をカウントする方法についても混乱しています。たとえ、上に挙げたさまざまな条件をすべて把握できると確信していたとしても. 配列を使用する必要がありますか? ハッシュ?または、私が何を望んでいるのかを考慮して、これに完全に間違った方向にアプローチしましたか。これらの変数の後にコメントとしてリストしたさまざまな条件を持つ行の数を数える必要があります。どんな助けでも大歓迎です!

4

2 に答える 2

6

正規表現で単語の出現をカウントできます。たとえば、 How it works?の出現を$hello = () = $line =~ /hello/g;カウントします。hello$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
于 2013-10-22T12:48:35.023 に答える
0

Perl には=~、文字列がパターンに一致するかどうかをテストするバインド演算子があります。これを 2 つの if ステートメントと組み合わせて使用​​すると、すべての行からカウントを引き出すことができます。

# only gathers counts
while (my $line = <STDIN>) {
   $hello_cnt++  if $line =~ /hello/;
   $goobye_cnt++ if $line =~ /goodbye/;
}

しかし、入力を1行ずつ推論したいようで、これらの変数をすべて維持することができます:カウント:$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 ...

行ごとの分析は中断しましたが、これが良い出発点になることを願っています。

于 2013-10-22T13:06:42.530 に答える