1

次の形式でエントリを次々と出力するファイルから情報を取得します: IPAddress xx [date:time -x] "method url httpversion" statuscode bytes "referer" "useragent"

そのファイルにコマンド ライン引数としてアクセスし、その情報を保存して、すべての情報をまとめて IP アドレスのアルファベット順に並べ替えるにはどうすればよいでしょうか? 何らかの形でハッシュと配列を使用する必要があると思います。

理論的には、コマンドライン引数として必要な数のテキスト ファイルを使用できますが、これまでのところ、その部分が機能していません。

./logprocess.pl monster.log #monster.log is the file that contains entries

次に、コード内で、指定されていないすべての変数がスカラーとして宣言されていると仮定します

my $x = 0;
my @hashstuff;
my $importPage = $ARGV[0];
my @pageFile = `$importPage`;
foreach my $line (@pageFile)
{

    $ipaddy, $date, $time, $method, $url, $httpvers, $statuscode, $bytes, $referer, $useragent =~ m#(\d+.\d+.\d+.\d+) \S+ \S+ [(\d+/\S+/\d+):(\d+:\d+:\d+) \S+] "(\S+) (\S+) (\S+)" (\d+) (\d+) "(\S+)" "(\S+ \S+ \S+ \S+ \S+)"#
    %info = ('ipaddy' => $ipaddy, 'date' => $date, 'time' => $time, 'method' => $method, 'url' => $url, 'httpvers' => $httpvers, 'statuscode' => $statuscode, 'bytes' => $bytes, 'referer' => $referer, 'useragent' => $useragent);
    $hashstuff[$x] = %info;
    $x++;
}

私のコンパイラは、次のようなグローバルシンボルエラーがあると言っているので、これを行うためのより良い方法は間違いなくあります。

./logprocess.pl 行 51 で % のあいまいな使用が演算子 % として解決されました (#2) (W ambiguous)(S) あなたは、あなたが思っているように解釈されないかもしれないことを言いました。通常、不足している引用符、演算子、括弧のペア、または宣言を提供することで、あいまいさを解消するのは非常に簡単です。

そしてそれは実行されません。どのモジュールも使用できません。

4

1 に答える 1

4

ログが Apache によって生成される場合は、Apache::ParseLogモジュールを利用できます。インスピレーションを得るために、ページの最後にある例を見てください。

あなたが言及したエラーに関しては、配列をmy次のように宣言する必要があります。

my @hashstuff;

そこに参照を追加します。また、単一のアイテムには次のようにアクセスします$hashstuff[$x](最初のドルに注意してください):

$hashstuff[$x] = { %info };

または完全に取り除くことができます$x

push @hashstuff, { %info };
于 2011-03-07T15:15:02.663 に答える