0

access_log ファイルを調べて、各検索エンジンがアクセスされた回数と、どれが最もアクセスされているかを確認するスクリプトを作成しています。構文の一部に問題があることは確かですが、実行時に情報が返されないため、わかりません。どんな助けでも大歓迎です!

コード:

#!/usr/bin/perl

use 5.010;

$googleCount = 0;
$msnCount = 0;
$yahooCount = 0;
$askCount = 0;
$bingCount = 0;


while (<STDIN>)
{
    if (/(google.com)/)
    {
        $googleCount++;
    }

    if (/(msn.com)/)
    {
        $msnCount++;
    }

    if (/yahoo.com/)
    {
        $yahooCount++;
    }

    if (/ask.com/)
    {
        $askCount++;
    }

    if (/bing.com/)
    {
        $bingCount++;
    }
}



print "Google.com was accessed $googleCount times in this log.\n";
print "MSN.com was accessed $msnCount times in this log.\n";
print "Yahoo.com was accessed $yahooCount times in this log.\n";
print "Ask.com was accessed $askCount times in this log.\n";
print "Bing.com was accessed $bingCount times in this log.\n";

私はMacOSを実行しています。ターミナルで次のように入力しています。

perl -w access_scan.pl access_log.1

Enterキーを押しても何も起こりません。

4

4 に答える 4

3

スクリプトは STDIN から読み取ろうとしていますが、読み取るファイル名を引数として指定しています。

スクリプトが入力を待っているため、「何も起こりません」(標準入力に何もリダイレクトしていないため、入力する必要があります)。

に変更<STDIN>する<>か、コマンドをperl -w access_scan.pl < access_log.1

于 2013-02-13T17:34:22.817 に答える
3

スクリプトが期待どおりに機能しなかったという事実に加えて、スクリプトにはいくつかの問題があります。

正規表現では、ドットは.改行以外の任意の文字に一致します。これには文字通りのピリオドが含まれますが、それに限定されません。エスケープするか ( /google\.com/)、特殊文字を\Q...\E:で保護します/\Qgoogle.com\E/

プログラミングのことわざに「3 つ以上、a を使用for」があります。正規表現を除いて、ループ内のすべての条件は同じです。あなたの数は、実際には 1 つの変数です。最後のレポートは同じ行が複数回あります。

ハッシュを使用して痛みを和らげることができます。

#!/usr/bin/perl
use strict; use warnings; use feature 'say';

my %count;  # a hash is a mapping of strings to scalars (e.g. numbers)
my @sites = qw/google.com msn.com yahoo.com ask.com bing.com/;

# initialize the counts we are interested in:
$count{$_} = 0 foreach @sites;

while (<>) { # accept input from files specified as command line options or STDIN
  foreach my $site (@sites) {
    $count{$site}++ if /\Q$site\E/i; # /i for case insensitive matching
  }
}

foreach my $site (@sites) {
  say "\u$site was accessed $count{$site} times in this log";
}

次の\u文字を大文字にします。これは、同一の出力を生成するために必要です。
sayとまったく同じですprintが、改行が追加されます。perl5 v10 以降で利用できます。

于 2013-02-13T19:47:35.733 に答える
0

スクリプトは標準入力から読み取っていますが、入力をファイルとして提供しています。次のようにリダイレクトする必要があります。

perl -w access_scan.pl < access_log.1

< fileコンストラクトは、ファイルの内容をスクリプトの標準入力として提供します。

于 2013-02-13T17:33:54.593 に答える
0

スクリプトは正常に動作します (テスト済み) が、STDIN のログをフィードする必要があります。

cat access_log.1 | perl -w access_scan.pl
于 2013-02-13T18:07:31.557 に答える