[완료][Perl] 레퍼런스을 이용해서 이중배열 만들기.
글쓴이: hitman7 / 작성시간: 월, 2007/07/23 - 7:31오후
전에 아파치 로그 정규표현식때문에 질문을 올리고 좋은대답을 많이 들어갔는데요. 그 일환으로.
일단하고자 하는일은 아파치 로그를 받아 parameter값을 기준으로 로그를 누적시키고자 합니다.
따라서 로그를 파싱해 가면서 생성된 리스트를 점검하고 같은 값이 있으면, 카운팅 증가, 값이 최초등장이라면
리스트에 추가를 시키려고 합니다.
# 로그 parsing 루프. $uid; $etcdata; $chkflag=0; for(@tlog) { for(@{$_}) { if("일치하면") { $chkflag=1 } else { #do nothing } } } if(!$chkflag) { @temparr[0]=$uid; @temparr[1]=$etcdata; @tlog=\@temparr; }
이런식인데요. 예상하시다 시피 @temparr의 주소를 참조하기 때문에 @tlog에 데이터가 중복되어서 들어가지네요.
즉. @tlog에 @temparr의 데이터를 카피 하고 싶다는것이죠.
가능하시면 고수님의 이중배열 사용 노우하우를 듣고 싶고요.
Forums:
로그 파싱이라..
일단 위 코드에서
@temparr[0],@temparr[1] 이라고 되어있는건 각각
$temparr[0],$temparr[1]이 되어야 Perl 5 문법에 맞을것 같네요.
그리고 Perl에서 array를 copy하시려면
@tlog = @temparr; 하면 됩니다.
그런데 만약 각 @temparr를 차례로 @tlog에 배열로 쌓아가는게 목적이라면
하시면 됩니다.
계속적으로 @tlog에 push 하면
([uid,etcdata],[uid,etcdata],...)
이렇게 쌓이게 됩니다.
@tlog안의 배열은 각각 익명배열레퍼런스(reference of anonymous array)로 들어가게 되죠.
만약 @tlog배열내의 첫번째 익명배열의 첫번째 요소에 접근하실려면
${$tlog[0]}[0]
또는
$tlog[0]->[0]
으로 하면 됩니다. 그리고 @tlog배열내의 첫번째 익명배열을 어떤 배열로 가져오려면
@array = @{$tlog[0]}
처럼 하면 됩니다.
그런데 님이 의도하시는 어떤 값을 기준으로 존재여부에 따라 카운팅을 증가시키려고 하시면
어떤 값을 hash key로 쓰시고 hash key의 value를 ++ 해 나가시는게 더 나을듯 합니다.
감사합니다.
답은 익명 배열이었군요!!!.
변수를 사용한 배열의 선언은 프로그램이 종료 되거나 코드 블럭에서 계속적으로 존재하지만,
익명 배열의 경우 새롭게 create되기 때문에 위의 코드에서는 temparr를 익명 배열로 사용하면 일단은
해결이군요..
(익명 배열쪽을 확인하니 위와 같은 내용이 있네요...ㅠ,.ㅠ)
감사합니다.
hash를 사용하지 않은 이유는 기준이 되는 값이 여러개이기 때문입니다..
그나저나 2GB나 되는 로그를 파싱하려니 시간이 엄청나군요.
대용량의 로그를 counting 할수 있는 좋은 방법이 없을라나요?
far and hard way
댓글 달기