0

我正在尝试解析作为数组引用进入我的脚本的日志行。

我有另一个子例程,此日志行被传递给它以提取某个值,但是该函数似乎没有接收日志行而是获取值 1。当我尝试取消引用数组 ref 并将其分配给标量也是如此。

日志行看起来像 -

print Dumper ($logline)

$VAR1 = '2013-06-07 17:22:32.219 <TID 1B344> [uss_smm.reqserv] 162.34.22.1: "POST /ts/start/67257-v/827987/ts/june7test1/backup/20130fd83788-02-ts&action=setarchiver&timestamp=1370625752.172546&as=new2 HTTP/1.1" 200 - Success.';

Assigning the dereferenced value to scalar -
my $temp_line = @{ $logline };
print "temp_line is $temp_line \n";

temp_line is 1

子程序调用是 -

my $arch = parse_Smmlog_Arch_Comm(@{ $logline }); 

解析的子程序是 -

sub parse_Smmlog_Arch_Comm($){
    my $logline = shift;
    print Dumper ($logline);
    test_log(INFO,"in parse_Smmlog_Arch(), logline is  - $logline ");
    my @arr = split('&as=',$logline);
    my @sec_arr = split(' ',$arr[1]);
    return $sec_arr[0];
}

我在运行脚本时得到了这个,这是因为子例程没有收到日志行。

Use of uninitialized value in split at /Users/myname/parseLog.pl

我将不胜感激这方面的任何帮助。

4

2 回答 2

1

$logline不是数组引用,它是一个纯字符串。

但是,您将其视为数组引用,因此它会查找如下数组变量:

@{'2013-06-07 17:22:32.219 <TID 1B344> [uss_smm.reqserv] 162.34.22.1: "POST /ts/start/500000-b/500000/ts/june7test1/backup/20130607T102446-02-ts&action=setarchiver&timestamp=1370625752.172546&as=new2 HTTP/1.1" 200 - Success.'}

这会失败use strict(这可以防止您意外使用这样的符号引用)。您应该在所有代码中启用use strict;use warnings;捕获许多简单的错误。

即使它是一个数组引用,这段代码:

my $temp_line = @{ $logline };

将数组中的元素数分配给$temp_line; 因为你得到了 1,所以你不小心在其他地方也使用了相同的符号引用,并且实际上用奇怪的名称创建和填充了数组。

要获取数组的第一个元素,请执行以下操作:

${ $logline }[0]

或从数组中删除它时获取它,请执行以下操作:

shift @{ $logline }

一般来说,使用引用只比使用简单的数组或散列稍微复杂一点。请参阅http://perlmonks.org/?node=References+quick+reference以获得一些易于记忆的规则来提供帮助。

于 2013-06-07T18:23:41.077 回答
0

问题可能与您的函数原型有关:

sub parse_Smmlog_Arch_Comm($)

这意味着它期待一个标量。当您将数组传递给它时,即@{ $logline },数组在标量上下文中进行评估,为您提供该数组中的元素数,即 1。

当你做第一个split时,你什么也得不到,所以@arr是空的,导致uninitialized value第二个错误split

从函数定义中替换或删除将$解决问题@($)或者,传递一个标量作为函数的参数。


旁注:在函数内部和外部使用相同的变量名表示不同的东西可能不是一个好主意(内部的字符串,外部的数组引用)

于 2013-06-07T20:11:27.213 回答