1

ウェブサイトからさまざまな種類の情報を取得する必要があります。フォーマットがこのようになっていることを知っています(すべて1行に):

"name":"BLAHBLAH","contact":{"phone":"12345","twitter":"BLAHBLAH"},
  "location": "address":"NOTTELLING","lat":10,"lng":10,"postalCode":"1234",
  "city":"BLAH","state":"BLAH","country":"BLAH"},
  "categories":[{"id":"BLAH","name":"BLAH"}]

これらのプロファイルの中には、名前や都市などがないなど、1つまたは2つのブロックが欠落しているものがあります。次のようなコードを試しました。

   #get name
   $content =~ m!","name":"(.*?)","contact":!igs;
   say ("name:", $1) unless ($1 eq '');
   #get street 
   if ($content =~ m!\},"location":\{"address":"(.*?)","lat":!igs)
   {say ("street:", $1) unless ($1 eq '');}
   #get city 
   if ($content =~ m!,"city":"(.*?)","state":!igs)
   {say ("city:", $1) unless ($1 eq '');}
   #get state
   if ($content =~ m!,"state":"(.*?)","country":!igs)
   {say ("state:", $1) unless ($1 eq '');}

次に、繰り返しパターンを使用すると、

"city":"(.*?)","state":!igs

"state":"(.*?)","country":!igs)

結果は正確ではありません。(perlは、最初に「state」に到達した後、文字列を飛び越えていると思います)私の質問は、これがどのように発生するかということです。どうすれば修正できますか?

4

2 に答える 2

3

それは私にはJSONによく似ています-確かにそうです。調べて、次を使用して、文字列全体をフィールド、、などのハッシュに変換できnameます。contactlocation

#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);

use JSON::XS;
use YAML::XS;

my $json = <<HERE;
{
  "name":"BLAHBLAH","contact":{"phone":"12345","twitter":"BLAHBLAH"},
  "location": {"address":"NOTTELLING","lat":10,"lng":10,"postalCode":"1234",
  "city":"BLAH","state":"BLAH","country":"BLAH"},
  "categories":[{"id":"BLAH","name":"BLAH"}]
}
HERE

print $json;

my $hash_ref = decode_json($json);

print Dump $hash_ref->{location}; 

{との間"location":にを追加する"address":必要がありました。これはあなたの側のタイプミスだと思います。とにかく、出力は次のとおりです。

{
  "name":"BLAHBLAH","contact":{"phone":"12345","twitter":"BLAHBLAH"},
  "location": {"address":"NOTTELLING","lat":10,"lng":10,"postalCode":"1234",
  "city":"BLAH","state":"BLAH","country":"BLAH"},
  "categories":[{"id":"BLAH","name":"BLAH"}]
}
---
address: NOTTELLING
city: BLAH
country: BLAH
lat: 10
lng: 10
postalCode: '1234'
state: BLAH

YAML::XS簡潔にするために使用しました。あなたはそれを必要としません。ポイントがまだわからない場合は、次のことを検討してください。

print $hash_ref->{location}->{state};

あなたに与えますBLAH

JSONは「javascriptオブジェクト表記」であり、特にオンラインでのオブジェクト指向言語(perlなど)の一般的なデータ交換形式です。

于 2012-05-19T14:37:17.647 に答える
0

この特定のケースでは、JSONパーサーは間違いなくそれを実行する正しい方法です-正規表現を使用してJSONを解析しようとする際の多くの落とし穴のうちの1つだけを説明しました。

ただし、正規表現に関する実際の質問に答えるには、次のようにします。

スカラーコンテキストで修飾子を指定して正規表現を使用すると/g(結果はスカラーに割り当てられるため、スカラーコンテキストで使用します)、最初の一致のみを処理し、停止して、同じ正規表現を呼び出すかどうかを確認します。次の一致を取得するために、同じ文字列で再度。このため、正規表現は通常、 :ではなく/gスカラーコンテキストで使用されます。whileif

$ perl -E 'while ("This is an example string." =~ /\b(\w{2,6})\b/g) { say $1 }'
This
is
an
string

修飾子を使用して正規表現を使用するもう1つの方法は、/g(結果を配列に割り当てることにより)正規表現を配列コンテキストに配置することです。この場合、すべての一致のリストが一度に返されます。

$ perl -E '@matches = "This is an example string." =~ /\b(\w{2,6})\b/g; say join ",", @matches;'
This,is,an,string

/gこれらの2つのことのいずれかを実行していない場合(スカラーコンテキストで結果をループするか、配列コンテキストで一致の完全なリストを使用する)、おそらく正規表現修飾子を使用したくないでしょう。

于 2012-05-20T11:33:58.907 に答える