2009-11-25 5 views
0

kstat -p을 사용하여 정보를 얻을 필요가있는 일부 작업을하고 있습니다. 그래서 모든 출력이 kstat -p 인 해시 변수를 생성하려고합니다. 액세스 값에Perl을 사용하여 kstat -p의 출력으로 해시를 만드는 방법은 무엇입니까?

Sample output from kstat -p 

cpu_stat:0:cpu_stat0:user  18804249 

@{$kstat->{cpu_stat}{0}{cpu_stat0}}{qw(user)}; 

또한 사용 가능한 모듈 CPAN 쳐다 보면서 Sun::Solaris::Kstat을 발견하지만 그건 내 일 버전을 사용할 수 없습니다했다. 출력 값이 kstat -p 인 해시 변수를 생성하는 코드를 제안하십시오.

+2

Sun :: Solaris :: Kstat이 존재하지 않는 것 같습니다. 솔라리스 :: Kstat 않습니다. 단순히 설치하지 않으시겠습니까? – innaM

+2

작성하려는 데이터 구조가 다소 이상해 보입니다. 최상위 배열을 원하십니까? qw (사용자)는 무엇을해야합니까? – innaM

+3

마지막으로, 정확히 당신의 문제는 무엇입니까? kstat의 출력을 구문 분석하는 데 도움이 필요합니까? 아니면 데이터 구조를 만드는 데 도움이 필요합니까? – innaM

답변

6

참조로 계층 적 데이터 구조를 만드는 것은 약간 까다 롭습니다. 유일한 흥미로운 부분은 최종 레벨을 다르게 처리하려는 것입니다 (새 해시 레벨을 작성하는 대신 값을 지정).

# If you don't create the ref here then assigning $target won't do 
# anything useful later on. 
my $kstat = {}; 
open my $fh, '-|', qw(kstat -p) or die "$! execing kstat"; 
while (<$fh>) { 
    chomp; 
    my ($compound_key, $value) = split " ", $_, 2; 
    my @hier = split /:/, $compound_key; 
    my $last_key = pop @hier; # handle this one differently. 
    my $target = $kstat; 
    for my $key (@hier) { # All intermediate levels 
    # Drill down to the next level, creating it if we have to. 
    $target = ($target->{$key} ||= {}); 
    } 
    $target->{$last_key} = $value; # Then write the final value in place. 
}