2013-06-07 15 views
0

내 스크립트로 들어오는 로그 라인을 배열 참조로 파싱하려고합니다.Perl- 배열 참조를 역 참조하고 변수에 결과를 할당하면 결과 값이 1 인 변수가됩니다.

이 로그 라인이 특정 값을 추출하기 위해 전달되는 또 다른 서브 루틴이 있지만 함수가 로그 라인을 수신하지 않고 값 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 

감사합니다.

답변

1

$logline은 배열 참조가 아니므로 일반 문자열입니다.

그러나 배열 참조로 취급되며, 따라서,이 같은 배열 변수를 찾습니다 (실수로이 같은 상징적 참조를 사용에서 당신을 유지하는) use strict에서 실패했을

@{'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 warnings;을 사용하여 많은 간단한 오류를 잡아야합니다.

가 배열 참조 코드 있었다하더라도 :

my $temp_line = @{ $logline }; 

$temp_line로 배열의 요소 번호를 지정; 당신이 1을 얻고 있기 때문에 실수로 같은 심볼릭 참조를 다른 곳에서도 사용하고 있습니다. 실제로 기괴한 이름으로 배열을 만들고 채우는 것입니다. 일반적

shift @{ $logline } 

은 참조를 사용하여 약간이다

${ $logline }[0] 

또는 어레이에서 제거하면서를 얻기가 수행

가 수행 어레이의 첫 번째 요소를 얻으려면 간단한 배열이나 해시를 사용하는 것보다 더 복잡합니다. 도움이되는 몇 가지 규칙을 기억하기 쉽도록 http://perlmonks.org/?node=References+quick+reference을 참조하십시오.

+0

덕분에 다른 일을 의미 같은 변수 이름을 가지고! 이전에 Dumper 출력에 실수가있었습니다. 참으로 배열 참조였습니다. 나는 print $ logline을 할 때 ARRAY (0x7f9d6c6f5278)를 얻었 기 때문에 이것을 확신한다. $ {$ logline} [0] 트릭을했습니다. – sudologin

+0

또한 항상 엄격한 경고를 사용합니다. 그 교훈을 얼마 전에 배웠습니다. – sudologin

0

문제는 아마 당신의 함수 프로토 타입과 관련이있다 :

sub parse_Smmlog_Arch_Comm($) 

는 스칼라를 기대 의미한다. 배열에 배열을 전달하면 (@{ $logline }) 배열은 스칼라 컨텍스트로 평가되고 배열의 요소 수는 1입니다.

첫 번째 split을 수행하면 아무 것도 얻을 수 없으므로 @arr은 비어있어 uninitialized value 오류가 두 번째 split으로 이어집니다.

$@으로 바꾸거나 ($)을 함수 정의에서 제거하면 문제가 해결됩니다. 또는 함수의 인수로 스칼라를 전달하십시오.


(!) 참고 : 아마 좋은 생각이 많은 (내부 배열 참조 외부 문자열)를 함수 내부 및 외부

+0

감사합니다. 변수 이름에 약간 동의합니다. – sudologin