2014-04-16 4 views
0

여러 배열 요소를 반복하려고하는데 배열을 기반으로 각 요소를 해당 값으로 인쇄하려고합니다. 두 배열이 같은이 가정foreach 배열 요소 인쇄

foreach (@_diskID, @_diskStatus) 
{ 
    # Print the data in JSON 
    print "\t,\n" if not $_first; 
    $_first = 0; 

    print "\t{\n"; 
    print "\t\t\"{#DISKID}\":\"$_\"\n"; 
    print "\n\t}\n"; 
} 

print "\n\t]\n"; 
print "}\n"; 

원하는 출력

{ 
     "data":[ 

     { 
      "{#DISKID}":" 0:0" 

     } 
     , 
     { 
      "{#STATUS}":" Ok" 

     } 
     , 
     { 
      "{#DISKID}":" 0:1" 

     } 
     , 
     { 
      "{#STATUS}":" Critical" 

     } 

     ] 
} 

답변

3

두 배열이 항상 같은 크기이면 실제 요소보다 배열의 인덱스를 반복하는 것이 더 간단합니다.

# only need one array here because they are the same size 
foreach my $i (0 .. $#_diskID) { 
    ... 
} 

은 또한 펄이 같은 JSON 문자열을 구축 할 필요가 없습니다, CPAN에 좋은 모듈이 해시에서 그들을 만들 수있는 JSON을했다.

그래서, 당신은 단순히 해시 만들 수있는이를 알고 : 당신의 도움에 대한

use strict; 
use warnings; 

use JSON; 

my @_disk = ('0:0','0:1'); 
my @_diskStatus= ('OK','Critical'); 

my %json_hash = (data => []); 
foreach my $i (0 .. $#_disk) { 
    push @{$json_hash{data}}, 
     { '{#DISKID}' => $_disk[$i], 
     '{#STATUS}' => $_diskStatus[$i], 
     }; 
} 

my $json_string = encode_json \%json_hash; 
print "$json_string\n"; 

# prints 
# {"data":[{"{#STATUS}":"OK","{#DISKID}":"0:0"},{"{#DISKID}":"0:1","{#STATUS}":"Critical"}]} 
+0

도움을 주셔서 감사합니다 :) 스크립팅 기술이 좋지 않습니다. 그런 모듈이 있다는 것을 몰랐습니다. 다시 한 번 감사드립니다. – Deano

1

: 여기

@_disk = ('0:0','0:1'); 
@_diskStatus= ('OK','Critical'); 

내가 시도 것을, 내가 원하는 출력을 얻기 위해 조건을 사용하는 방법을 잘 모르겠어요입니다 요소 수 :

use warnings; 
use strict; 

my @_disk = ('0:0','0:1'); 
my @_diskStatus = ('OK','Critical'); 

for my $i (0 .. $#_disk) { 
    print "$_disk[$i] $_diskStatus[$i]\n"; 
} 
+1

감사합니다! – Deano