0
use 5.010;
use strict;
use warnings;
use JSON::XS;
use YAML::XS;
my %data = ();
my $content = <<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

my $id = "name1";

sub function {
    my ( $id, $data, $content ) = @_;
    my %data = %$data;
    my $out = decode_json($content);
    say "out:", Dump $out;
    $data{$id} = $out;
}

function( $id, \%data, $content );
say "data:", Dump %data;

これは私が期待したようには機能しません。なぜ、どのように機能するのか教えてください。

4

3 に答える 3

4

「これは私が期待したようには機能しません。」

何を期待していましたか?エラーを順に見ていきましょう。

1) date!=data

2)コンマが含まれていないため、空のままになり$content=~m!(,*)!ます。$1$content

3)は空であり、適切にフォーマットされた JSON 文字列にのみ適用できるdecode_json($1)ため、実行時エラーがスローされます。$1decode_json()

4)$id定義されていません。

「なぜ、どのように機能するのか教えてください。」

それがはっきりしないとうまくいきません。 そこにはコードよりも多くのエラーがあります。

「ハッシュ参照をハッシュに割り当てるにはどうすればよいですか?」

\単項参照演算子を使用します。例:

my %h = ();

my %h2 = (
    a => 10
);

$h{h2} = \%h2;

print $h{h2}->{a};  

匿名(名前のない) ハッシュ$への参照としてスカラー ( ) を宣言することもできます。ここに参照があります。ハッシュ自体には、それに関連付けられたシンボルや名前はありません。$hr

my $hr = {
    n => 42
};

# as an existing hash member:

$h{h3} = {
    x => 666,
    # some other examples:
    hr => \%h2,
    hr2 => {
        x => 1024
    }    
};

{}の代わりに宣言で中括弧が使用されていることに注意してください()。のように (匿名の) ハッシュをネストする場合はhr2、常にその形式を使用してください。

perl hash tutorialを検索すると、より詳細な情報が見つかります。

于 2012-05-20T09:00:41.747 に答える
3

%dataパッケージ スコープ( の直後に定義されたもの)で何も見つからない理由は、with の行内にuse YAML::XSまったく新しい完全に独立したものを作成しているためです。%datafunction

my %data = %$data;

これにより、新しいハッシュが作成され、参照されるハッシュの内容がそれにコピーさ$dataれます。

代わりにこれを試してください:

sub function {
  my ($id, $data, $content) = @_;
  my $out = decode_json($content);
  say "out:", Dump $out;
  $data->{$id} = $out;
}
于 2012-05-20T11:51:42.083 に答える
0

タイプミスがあると思います:

function($id,/%data,$content);

でなければなりません

function($id,\%data,$content);

$content は %data ハッシュへの参照ではないため、関数では次のようにする必要があります。

my %data=%$data;  # in place of "my %content=%$content;"
于 2012-05-20T09:32:57.283 に答える