perl hash값 취득 질문

negabaro의 이미지

my $send = {};
open( MAIL, "/bin/cat /var/log/maillog | /bin/grep 'postfix/smtpd' | /bin/grep 'sasl_username=' |" );
while( my $line = ) {
#if( $line =~ /client=(.*), sasl_method=\w+, sasl_username=(.*)$/ ) {
if( $line =~ /]: (.*): client=(.*), sasl_method=\w+, sasl_username=(.*)$/ ) {
#printf( "QUEUE=[%s] User=[%s], Client=[%s]\n",$1, $3, $2);
$send->{ $2 }->{ $1 }->{ $3 }++;

이런 소스가 있는데 send안에 값을 자유롭게 취득하고 싶습니다.

제 예상으로 send안에 이런식으로 값이 들어 있다고 생각 하는데
{{xxx,xxx,xxx}{xxx,xxx,xxx}{xxx,xxx,xxx}}

$1
$2
$3

번의 값들만 각자 취득하려면 어떻게 해야되나요?

foreach my $kaka (keys %{ $send } ){
my $haha = $send->{ $kaka };
printf( "USER2=[%s]\n", $kaka);

}

이렇게 해서 $2번 값을 취득하는건 성공했습니다..$send->{ $2 }->{ $1 }->{ $3 }++;로 되있으니까 $2가 send의 0번째 자리에 있어서 취득된걸로보입니다.

raymundo의 이미지

코드가 이상하게 깨져 있어서 헷갈린데 (코드 위 아래에 code, /code 태그로 둘러싸 주세요)

$send 안의 형태는 생각하신 대로가 아니라

$send = {
	'A' => {
		'a' => {
			1 => 12,
			2 => 5,
		},
		'b' => {
			1 => 20,
			5 => 13,
		}
	},
	'B' => {
		'a' => {
			3 => 7
		},
		'c' => {
			1 => 15,
			4 => 20,
			7 => 32,
		}
	}
}

이런 형태가 됩니다.

위의 경우 첫 단계 ($2)에 해당하는 부분은 'A', 'B' 두 가지입니다만,

두번째 단계($1)에 해당하는 부분은... 보기에 따라 달라집니다. 애초에 $send->{A}와 $send->{B}가 서로 다른 별개의 익명 해시를 가리키는 레퍼런스이니까요. 이런 경우 ('a','b') 아 ('a','c') 이렇게 각각 다르게 처리할지, 아니면 그냥 두번째 단계에 나오는 것을 모두 모아서 ('a','b','c')로 처리할지는 자기가 무슨 일을 할지에 따라 다르겠지요.

세번째 단계도 마찬가지고요.

암튼 저걸 쭉 뽑아내고 싶다면 본문에 적으신, 첫단계의 키를 뽑아내는 코드를 각 단계별로 중첩하시면 됩니다.

foreach my $key1 ( keys %{ $send } ) {
    push @keys_level1, $key1;   # 원하신다면 이렇게 각 단계의 키들을 따로 리스트에 넣어둘 수도 있겠고
    foreach my $key2 ( keys %{ $send->{$key1} } ) {
        foreach my $key3 ( keys %{ $send->{$key1}->{$key2} } ) {
            print "[$key1] [$key2] [$key3] => [$send->{$key1}{$key2}{$key3}]\n";
        }
    }
}

좋은 하루 되세요!

negabaro의 이미지

답변감사합니다

#!/usr/local/bin/perl -w
use strict;
use Data::Dumper;
use LWP::Simple;
 
 
my $send = {
	'A' => {
		'a' => {
			1 => 12,
			2 => 5,
		},
		'b' => {
			1 => 20,
			5 => 13,
		}
	},
	'B' => {
		'a' => {
			3 => 7
		},
		'c' => {
			1 => 15,
			4 => 20,
			7 => 32,
		}
	}
}
 
 
 
 
foreach my $key1 ( keys %{ $send } ) {
 
    foreach my $key2 ( keys %{ $send->{$key1} } ) {
        foreach my $key3 ( keys %{ $send->{$key1}->{$key2} } ) {
            print "[$key1] [$key2] [$key3] => [$send->{$key1}{$key2}{$key3}]\n";
        }
    }
}

로 하니까

foreach my $key1 ( keys %{ $send } ) {

이 부분에 에러가 나는데 이건 왜그런건가요?

혹은 이 변수가 현재 어떤형식인지 볼 수 있는 방법이 있나요?

raymundo의 이미지

에러는, foreach 문단 위에 $send 변수할당 끝에 세미콜론 넣어주시면 될 거고요.

적으신 거 보니까 Data::Dumper 모듈도 아시는 것 같은데 그냥 그거 써서 보시면 됩니다.

print Dumper($send);

좀 더 예쁘게 보고 싶으면

use Data::Printer;   # 없으면 설치하셔야 할 거고
p $send;

좋은 하루 되세요!

negabaro의 이미지

와아.. ;세미콜론이 필요했군요

기본적인 것같은데 친절히 설명해주셔서 감사합니다.

열심히 공부하겠습니다!!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.