2014-02-16 5 views
0

я файл показанный как ниже:Read Массив из файла в Perl-массив

{ 
"status": "success", 
"msg": { 
    "status": "success", 
    "inscount": 2, 
    "critical": 0, 
    "result": [ 
     { 
      "Insulin": "Insuman Rapid", 
      "morning change": 0, 
      "noon change": 1, 
      "evening change": 0, 
      "action": 3, 
      "change morning from": "22", 
      "change noon from": "9", 
      "change evening from": "20", 
      "change morning to": "22", 
      "change noon to": "12", 
      "change evening to": "20", 
      "change type": "1" 
     }, 
     { 
      "Insulin": "Insuman basal", 
      "morning change": 0, 
      "noon change": 0, 
      "evening change": 0, 
      "action": null, 
      "change morning from": "7", 
      "change noon from": "6", 
      "change evening from": "8", 
      "change morning to": "7", 
      "change noon to": "6", 
      "change evening to": "8", 
      "change type": “1” 
     } 
    ], 
    "balance": "9974" 
} 

}

это ответ JSON из веб-службы и я храню его в темп , файл. Я хочу извлечь массив результатов в массив perl объекта.

он был создан с помощью следующего вызова службы

system("curl -X POST -H '$CONTENT_TYPE' -d '$ARGS' -o $TEMP_FILE $SERVICE_URL 2>/dev/null"); 

Я использую этот код для извлечения состояния, критического и inscount

if (open(OUTFILE,"<$TEMP_FILE")) { 
    while(<OUTFILE>) { 
     chomp; 
     if (/status\"?\:\s*\"success\"/) { 
      $SUCCESS=1; 
      print"Success File open********* Febin :) \n"; 
     } 

     if (/critical\"?\:\s*\"1\"/) { 
      $CRITICAL=1; 
     } 

     if (/change type\"?\:\s*\"(\d+)\"/) { 
      $CHANGE_TYPE=$1; 
     } 

     if (/balance\"?\:\s*\"([^\"]+)\"/) { 
      $BALANCE=$1; 
     } 

     foreach $key (keys %TIME_VALUES) { 
      if(/$key\schange\"?\:\s*\"1\"/) { 
       $TIME_VALUES{$key}[0] = 1; 
      } 

      if(/change $key from\"?\:\s*\"([^\"]+)\"/) { 
       $TIME_VALUES{$key}[1] = $1; 
      } 

      if(/change $key to\"?\:\s*\"([^\"]+)\"/) { 
       $TIME_VALUES{$key}[2] = $1; 
      } 
     } 
    } 
    close(OUTFILE); 

есть способ сделать это, пожалуйста, помогите

Я новичок в perl scripting

+2

Кроме того, почему нужно сохранить временный файл, когда вы можете использовать LWP + в парсинга модуль JSON из CPAN? –

+0

@john jensen. потому что я редактирую существующий код IVR звездочки, который он сделал раньше кем-то другим. С изменением в сервисе ответ Json отправит результат как массив до этого его не было –

ответ

2

Может быть, не в полной мере понять вопрос, но ИМХО следующее может работать:

use Modern::Perl; 
use JSON::XS; 
use Encode; 
use File::Slurp; 
use Data::Dumper; 

my $file = "./data.json"; 
my $data = decode_json Encode::encode 'utf8', read_file $file, { binmode => ':utf8' } ; 

my $res; 
$res->{$_} = $data->{msg}->{$_} for(qw(status critical inscount)); 

say Dumper $res; 

для вашего входного файла производит:

$VAR1 = { 
      'critical' => 0, 
      'inscount' => 2, 
      'status' => 'success' 
     }; 

Вы должны использовать JSON :: XS для разбора JSON для внутренней структуры perl и может пропускать части encode/utf, если ваши данные только ascii ...

EDIT - для повышения читаемости - прокомментировал:

use Modern::Perl; #use some modern perl features, like: say and strict and warnings 

        #"load" some modules: 
use JSON::XS;  #for the JSON parsing 
use Encode;  #module for encoding from/to different encodings 
use File::Slurp; #module for reading files into a variable 
use Data::Dumper; #module for dumping data structures 

my $file = "./data.json"; #the filename, where your "JSON" data is 

#read the file content into the variable (read_file - provided by the File::SLurp) 
my $json_from_file = read_file $file, { binmode => ':utf8' }; 

#encode 
my $encoded_json = Encode::encode 'utf8', $json_from_file; 

#convert JSON to internal perl-data structure 
my $perl_data = decode_json $encoded_json; 

say "=== the data structure ==="; 
say Dumper $perl_data; 

# copy the needed data 
my $status = $perl_data->{msg}->{status}; 
my $critical = $perl_data->{msg}->{critical}; 
my $inscount = $perl_data->{msg}->{inscount}; 
#this is useless, because you can use the $perl_data->{msg}->{status} directly 
+0

, но я хочу прочитать это из файла –

+0

Это именно то, что он делает –

+0

@FebinFathah добавил объяснение – jm666

Смежные вопросы