Eğer Perl bir dizi olmasını bir skalar veya dizi ref ya zorlayabilir miyim?

oy
25

Bir perl değişken var $resultsbir hizmetten geri alır. Değeri bir dizi olması gerekiyordu ve $resultsbir dizi referans olmalıdır. Dizi İçinde yalnızca bir öğe vardır Ancak, $resultsbu bir öğe içeren bir referans dizisi bu değere ayarlanır ve edilmeyecektir.

Ben yapmak istiyorum foreachbeklenen dizi döngü. Denetimi olmadan ref($results) eq 'ARRAY', aşağıdaki eşdeğer bir şey için herhangi bir yolu vardır:

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

Yani belirli kod örneği başvuru için çalışacaktır ancak basit sayısal alan için şikayet edecektir.

DÜZENLEME: Beni hizmetten döndürülecek değiştirmek için hiçbir yol olduğunu açıklığa kavuşturmak gerekir. sorun yalnızca bir değer olup, birden fazla değer olduğunda, dizi bir referans olacak zaman değeri, bir skaler olacağıdır.

Oluştur 06/08/2008 saat 06:56
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
26

başka bir yolu daha var emin im:

$result = [ $result ]   if ref($result) ne 'ARRAY';  
foreach .....
Cevap 06/08/2008 saat 08:13
kaynak kullanıcı

oy
12

Başka bir çözüm hayatının geri kalanını basitleştirmek için daima bir dizi dönmek sunucuya çağrı sarın ve buna sahip olacaktır:

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

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

Sonra her zaman yalnızca bir öğe oldu bile, bir diziye bir başvuru geri alacak bilemez.

foreach my $item (@{call_to_service()})
{
  ...
}
Cevap 19/08/2008 saat 15:16
kaynak kullanıcı

oy
2

Peki yapamazsanız ...

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

veya bu...

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

o zaman böyle korkutucu tüylü bir şey denemek zorunda kalabilirsiniz! ....

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

o fugly gerçekten çirkin olur eval ve tehlikeli dize önlemek için !! ....

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

PS. Benim tercih soyut uzakta alt reatmon tarafından verilen call_to_service () örnek ala olacaktır.

Cevap 12/10/2008 saat 22:14
kaynak kullanıcı

oy
0

Böyle yapabilirsiniz:

my @some_array
push (@some_array, results);
foreach my $elt(@some_array){
  #do something
}
Cevap 23/11/2016 saat 05:34
kaynak kullanıcı

oy
0

Yapmam sonra döngü içinde kod faktörü-re ve olur

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

Tabii ki sadece döngü kodu önemsiz olmayan olsaydı o yapardı.

Cevap 14/08/2008 saat 22:41
kaynak kullanıcı

oy
0

Sadece bu test ettik:

#!/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";
}

Ve Tamam çalışmak gibi, bu yüzden sonuç hizmetinden döndürülen alma ile ilgili bir şey vardır düşünüyorum? Eğer dönen hizmete üzerinde denetimi varsa bir çatlak bu zor olabilir

Cevap 06/08/2008 saat 07:22
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more