[완료][Perl] 레퍼런스을 이용해서 이중배열 만들기.

hitman7의 이미지

전에 아파치 로그 정규표현식때문에 질문을 올리고 좋은대답을 많이 들어갔는데요. 그 일환으로.

일단하고자 하는일은 아파치 로그를 받아 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의 데이터를 카피 하고 싶다는것이죠.

가능하시면 고수님의 이중배열 사용 노우하우를 듣고 싶고요.

aero의 이미지

일단 위 코드에서

    @temparr[0]=$uid;
    @temparr[1]=$etcdata;
    @tlog=\@temparr;

@temparr[0],@temparr[1] 이라고 되어있는건 각각
$temparr[0],$temparr[1]이 되어야 Perl 5 문법에 맞을것 같네요.
그리고 Perl에서 array를 copy하시려면
@tlog = @temparr; 하면 됩니다.

그런데 만약 각 @temparr를 차례로 @tlog에 배열로 쌓아가는게 목적이라면

push @tlog, \@temparr

하시면 됩니다.

계속적으로 @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를 ++ 해 나가시는게 더 나을듯 합니다.

hitman7의 이미지

답은 익명 배열이었군요!!!.

변수를 사용한 배열의 선언은 프로그램이 종료 되거나 코드 블럭에서 계속적으로 존재하지만,
익명 배열의 경우 새롭게 create되기 때문에 위의 코드에서는 temparr를 익명 배열로 사용하면 일단은
해결이군요..

(익명 배열쪽을 확인하니 위와 같은 내용이 있네요...ㅠ,.ㅠ)

감사합니다.

hash를 사용하지 않은 이유는 기준이 되는 값이 여러개이기 때문입니다..

그나저나 2GB나 되는 로그를 파싱하려니 시간이 엄청나군요.

대용량의 로그를 counting 할수 있는 좋은 방법이 없을라나요?

far and hard way

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.