2012-07-21 16 views
10

Ich versuche, diesen Perl-Code zu verstehen ...ungeradee Anzahl von Elementen in anonymen Hash

Wenn ein Stream ist es funktioniert, wenn es zwei oder mehr Ströme mit ungerader Anzahl von Elementen in anonymen warnt Hash. Es scheint in diesem Fall ein Array zurückzugeben. Wie füge ich die Array-Elemente korrekt zu @streams hinzu? Es scheint korrekt für den HASH-Fall in der If-Klausel hinzuzufügen. Stimmt die else-Klausel?

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); 

ich die nächsten Zeilen bin Hinzufügen ...

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).")"; 
    } 

Es jetzt Fehler mit

Web API Fehlercode S zurückgegeben: Server: Aufruf getStreamDefects: Kein Strom gefunden für Namen Null. $ VAR1 = -1; mir Kann Zeichenkette nicht ("-1") als HASH ref während "strict refs" im Einsatz bei xyz-handler.pl Linie 317.

einig Dumper Ausgabe

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

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

Antwort

14

Die Liste verwendet einem Hash zugeordnet ist eine Menge von Schlüssel/Wert-Paaren, weshalb die Anzahl der Elemente gerade sein muss.

Da der => Betreiber wenig mehr als ein Komma ist, und die @streams Array wird in der Liste abgeflacht, diese

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

entspricht dieser

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

so kann ich hoffen, dass Sie sehen, dass Sie die Warnung bekommen, wenn Sie eine sogar Anzahl der Elemente im Array haben.

Dinge beheben Sie den Wert des Hash-Element benötigen ein Array Referenz, zu sein, die ein Skalar ist und das Schema der Dinge

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

auf diese Weise Sie das Array nicht aufregen zugreifen Elemente wie

$stream_defect_filter_spec->{streamIdList}[0] 

usw.

Und durch die Art und Weise Sie Ihren Code wesentlich aufzuräumen kannindem mantun, was es ist gut:

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

Die Zuordnung in:

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

nicht korrekt ist, Sie Hash-Schlüssel aus dem 1 3 5. ... Array-Elemente erhalten.

Sie wollen wahrscheinlich ein Hinweis auf Array zuweisen, nicht das Array selbst:

'streamIdList' => \@streams, 

Beispiel für die unerwünschte (wie in Ihrem Code):

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

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

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

unerwünschtes Ergebnis:

["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 

Beispiel für die Zuweisung einer Referenz

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

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

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

produziert:

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

Der Unterschied ist deutlich sichtbar.

+0

Bitte überprüfen Sie die Antwort erneut. immer noch Ausgabe –

+0

@DB, beide Beispiele hinzugefügt. – jm666

Verwandte Themen