14

このPerlコードを理解しようとしています...

ストリームが 1 つある場合は機能し、ストリームが 2 つ以上ある場合は、匿名ハッシュの要素数が奇数であると警告します。その場合は配列を返すようです。配列要素を @streams に正しく追加するにはどうすればよいですか? if 句の HASH ケースに正しく追加されているようです。else 句は二段ベッドですか?

 my $x = $viewedProjectDataObj->{streams};

    if (ref($x) eq 'HASH') {
        push(@streams, $x->{id});
    } elsif (ref($x) eq 'ARRAY') {

        print "$x\n";
        print "@$x\n";
        my @array = @$x;
        foreach my $obj (@array) {
            print "in $obj\n";
            print Dumper( $obj);
            push(@streams,  ($obj->{id}) );
        }
    }

    print "streamcount " . @streams % 2;
    print Dumper(@streams);


    my $stream_defect_filter_spec = {
        'streamIdList' => @streams,
        'includeDefectInstances' => 'true',
        'includeHistory' => 'true',
    };

    my @streamDefects = $WS->get_stream_defects($defectProxy, \@cids,             $stream_defect_filter_spec);
    print Dumper(@streamDefects);

次の行を追加しています...

if ($defectSummary->{owner} eq "Various") {
    foreach (@streamDefects) {
        if (exists($_->{owner})) {
            $defectSummary->{owner} = $_->{owner};
            last;
        }
    }
}

my $diref = $streamDefects[0]->{defectInstances};
if ($diref) {
    my $defectInstance;
    if (ref($diref) eq 'HASH') {
        $defectInstance = $diref;
    } elsif (ref($diref) eq 'ARRAY') {
        $defectInstance = @{$diref}[0];
    } else {
        die "Unable to handle $diref (".ref($diref).")";
    }

今ではエラーになります

Web API がエラー コード S:Server を返しました: getStreamDefects を呼び出しています: 名前が null のストリームが見つかりません。$VAR1 = -1; xyz-handler.pl 行 317 で「strict refs」が使用されている間、文字列 (「-1」) を HASH ref として使用できません。

いくつかのダンパー出力

$VAR1 = {
      'streamIdList' => [
                          {
                            'name' => 'asdfasdfadsfasdfa'
                          },
                          {
                            'name' => 'cpp-62bad47d63cfb25e76b29a4801c61d8d'

                          }
                        ],
      'includeDefectInstances' => 'true',
      'includeHistory' => 'true'
    };
4

2 に答える 2

17

ハッシュに割り当てられたリストは、キーと値のペアのセットであるため、要素の数は偶数でなければなりません。

=>演算子はコンマにすぎず、@streams配列はリスト内でフラット化されているため、これは

my $stream_defect_filter_spec = {
  'streamIdList' => @streams,
  'includeDefectInstances' => 'true',
  'includeHistory' => 'true',
};

これに等しい

my $stream_defect_filter_spec = {
  'streamIdList' => $streams[0],
  $streams[1] => $streams[2],
  $streams[3] => $streams[4],
  ...
  'includeDefectInstances' => 'true',
  'includeHistory' => 'true',
};

配列に偶数の要素がある場合に警告が表示されることを確認していただければ幸いです。

物事を修正するには、ハッシュ要素の値を配列参照にする必要があります。これはスカラーであり、物事のスキームを混乱させません

my $stream_defect_filter_spec = {
  'streamIdList' => \@streams,
  'includeDefectInstances' => 'true',
  'includeHistory' => 'true',
};

そうすれば、配列要素に次のようにアクセスできます

$stream_defect_filter_spec->{streamIdList}[0]

mapちなみに、コードの得意なことを実行させることで、コードを大幅に整理できます。

if (ref $x eq 'HASH') {
  push @streams, $x->{id};
}
elsif (ref $x eq 'ARRAY') {
  push @streams, map $_->{id}, @$x;
}
于 2012-07-21T19:22:40.433 に答える
8

割り当て:

my $stream_defect_filter_spec = {
        'streamIdList' => @streams,    # <---- THIS ONE
        'includeDefectInstances' => 'true',
        'includeHistory' => 'true',
};

は正しくありません。1 3 5 ... 配列要素からハッシュ キーを取得します。

おそらく、配列自体ではなく、配列への参照を割り当てたいと思うでしょう:

'streamIdList' => \@streams,

不要な例(コードのように):

use strict;
use warnings;
use Data::Dump;

my @z = qw(a b c x y z);
dd \@z;

my $q = {
    'aa' => @z,
};
dd $q;

望ましくない結果:

["a", "b", "c", "x", "y", "z"]
Odd number of elements in anonymous hash at a line 12.
{ aa => "a", b => "c", x => "y", z => undef }

                                      ^-here

参照の割り当ての例

use strict;
use warnings;
use Data::Dump;

my @z = qw(a b c x y z);
dd \@z;

my $q = {
    'aa' => \@z,
};
dd $q;

生成:

["a", "b", "c", "x", "y", "z"]
{ aa => ["a", "b", "c", "x", "y", "z"] }

違いは明らかです。

于 2012-07-21T19:30:49.523 に答える