0

スクリプトに配列参照として入ってくるログ行を解析しようとしています。

特定の値を抽出するためにこのログ行が渡される別のサブルーチンがありますが、関数はログ行を受信して​​いないようで、代わりに値 1 を取得します。スカラーも。

ログ行は次のようになります-

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;andを有効にする必要があります。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、2 番目の でエラーが発生しますsplit

を置き換えるか、関数定義から削除する$と、問題が解決します。または、関数の引数としてスカラーを渡します。@($)


補足: 関数の内部と外部で異なる意味を持つ同じ変数名を使用することは、おそらく良い考えではありません (内部の文字列、外部の配列参照)。

于 2013-06-07T20:11:27.213 に答える