从以下格式输入条目的文件中获取信息: IPAddress x x [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)上模糊使用%resolve as operator% (W模棱两可)(S)你说的话可能无法解释 你以为。通常情况下,通过提供消除歧义很容易 缺少引号,运算符,括号对或声明。
它不会执行。我不能使用任何模块。
答案 0 :(得分:4)
如果日志是由Apache生成的,则可以使用Apache::ParseLog模块。请查看页面末尾的示例以获取灵感。
关于您提到的错误,您应该使用my
声明您的数组:
my @hashstuff;
并添加引用。此外,还可以使用$hashstuff[$x]
访问单个项目(请注意开头的美元):
$hashstuff[$x] = { %info };
或者你可以完全摆脱$x
:
push @hashstuff, { %info };