Vra

Ek het'n perl veranderlike $results wat kry teruggekeer van'n diens.Die waarde veronderstel is om te wees'n skikking, en $results moet word om'n verskeidenheid verwysing.Egter, wanneer die skikking het net een item in dit, $results sal ingestel word om daardie waarde, en nie'n gekla skikking wat bevat dat een item.

Ek wil'n om te doen foreach lus op die verwagte skikking.Sonder kontrole ref($results) eq 'ARRAY', is daar enige manier om iets gelykstaande aan die volgende:

foreach my $result (@$results) {
    # Process $result
}

Daardie spesifieke kode monster sal werk vir die verwysing, maar sal kla vir die eenvoudige scalar.

EDIT:Ek moet verduidelik dat daar is geen manier vir my om te verander wat teruggekeer het uit die diens.Die probleem is dat die waarde sal wees'n scalar wanneer daar is slegs een waarde, en dit sal word'n verskeidenheid verwysing wanneer daar is meer as een waarde.

Was dit nuttig?

Oplossing

Ek is nie seker daar is 'n ander manier as:

$result = [ $result ]   if ref($result) ne 'ARRAY';  
foreach .....

Ander wenke

Nog 'n oplossing sou wees om die oproep te draai na die bediener en het dit altyd 'n verskeidenheid terug te keer na die res van jou lewe te vereenvoudig:

sub call_to_service
{
    my $returnValue = service::call();

    if (ref($returnValue) eq "ARRAY")
    {
        return($returnValue);
    }
    else
    {
       return( [$returnValue] );
    }
}

Dan kan jy altyd weet dat jy terug 'n verwysing na 'n skikking sal kry, selfs al was dit net een item.

foreach my $item (@{call_to_service()})
{
  ...
}

Wel, as jy nie kan doen nie ...

for my $result ( ref $results eq 'ARRAY' ? @$results : $results ) {
    # Process result
}

of dit ...

for my $result ( ! ref $results ? $results : @$results ) {
    # Process result
}

dan kan jy dalk iets harige scary soos hierdie probeer! ....

for my $result ( eval { @$results }, eval $results ) {
    # Process result
}

en dat gevaarlike string voorkom eval dit regtig lelik fugly !! ....

for my $result ( eval { $results->[0] } || $results, eval { @$results[1 .. $#{ $results }] } ) {
    # Process result
}

PS. My voorkeur sou wees om abstrakte dit weg in sub ala call_to_service () voorbeeld gegee deur reatmon.

Ek sou weer faktor die kode binne die lus en dan doen

if( ref $results eq 'ARRAY' ){
    my_sub($result) for my $result (@$results);
}else{
    my_sub($results);
}

Natuurlik sou ek net doen as die kode in die lus was nie-triviale.

Ek het net getoets met:

#!/usr/bin/perl -w
use strict;

sub testit {

 my @ret = ();
 if (shift){
   push @ret,1;
   push @ret,2;
   push @ret,3;
}else{
  push @ret,"oneonly";
}

return \@ret;
}

foreach my $r (@{testit(1)}){
  print $r." test1\n";
}
foreach my $r (@{testit()}){
   print $r." test2\n";
}

En dit blyk te werk ok, so ek dink dit het iets te doen met die gevolg om teruggekeer van die diens?As jy het geen beheer oor die terugkeer van diens, dit kan moeilik wees om een te kraak

Jy kan dit doen soos hierdie:

my @some_array
push (@some_array, results);
foreach my $elt(@some_array){
  #do something
}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top