2013-10-08 23 views
5

spodziewałbym następujący kodanomalne zachowanie Push ramach Catalyst MVC

my @array; 
for my $rapport (qw(value1 value2 value3)) { 
    push @array, { key => $rapport }; 
} 

do przedstawienia:

$VAR1 = [ 
     { 
     'key' => 'value1' 
     }, 
     { 
     'key' => 'value2' 
     }, 
     { 
     'key' => 'value3' 
     } 
    ]; 

jednak uruchomiony ten segment kodu pod Catalyst MVC uzyskać:

$VAR1 = [ 
      { 
      'key' => [ 'value', 'value2', 'value3' ] 
      }, 
     ]; 

Czy ktoś może mi wyjaśnić, dlaczego?

EDYCJA: Czy ktoś z tym samym problemem może podać przykład? Nie mogę się odtworzyć po pewnych zmianach w kodzie, ale ponieważ zostało 5 razy wznowione, zakładam, że inni użytkownicy również doświadczyli tego problemu?

+0

Przepraszam, jeśli jestem głupi. Masz na myśli działanie w ramach Catalyst MVC? wersja perl? – mikew

+2

Co się stanie, jeśli spróbujesz użyć funkcji $ rapport (@ {['value1', 'value2' ..]}). Wygląda na to, że $ rapport otrzymuje przypisanie tablicy wartości [value1, value2, value3], a pętla wykonuje tylko jeden raz. Co oznaczałoby, że popychanie nie jest sprawcą. – mikew

+0

mikew, Mam upvoted twój komentarz. Twoje założenie jest prawdopodobnie poprawne. Nie mogę odtworzyć tego teraz, ponieważ w międzyczasie zmieniono kod. Chciałbym wiedzieć, dlaczego pytanie zostało 3 razy wznowione ... –

Odpowiedz

1

Przykład ten kod ...

#!/usr/bin/perl 

use Data::Dumper; 
my @input = ("var1", "var2", "var3"); 
my @array; 
for my $rapport (@input) { 
    push @array, { key => $rapport }; 
} 

print Dumper(\@array); 

exit; 

produkuje ...

$VAR1 = [ 
      { 
      'key' => 'var1' 
      }, 
      { 
      'key' => 'var2' 
      }, 
      { 
      'key' => 'var3' 
      } 
     ]; 

ale po ...

#!/usr/bin/perl 

use Data::Dumper; 
my @input = [ "var1", "var2", "var3" ]; # sometimes people forget to dereference their variables 
my @array; 
for my $rapport (@input) { 
    push @array, { key => $rapport }; 
} 

print Dumper(\@array); 

exit; 

pokazy ...

$VAR1 = [ 
      { 
      'key' => [ 
         'var1', 
         'var2', 
         'var3' 
        ] 
      } 
     ]; 

Jak widać oba przykłady przechodzą przez macierz, ale druga to tablica, która została zainicjowana wartością odniesienia. Ponieważ w Catalyst zwykle przesyłasz różne wartości za pośrednictwem aplikacji za pomocą skrytek lub podobnych konstrukcji, możesz sprawdzić, czy twoja tablica zawiera wartości skalarne:)

+0

deviolog, myślę, że możesz być na czymś. Jak już wspomniałem w moim poście, nie mam już kodu, więc nie mogę odtworzyć problemu. Twoja hipoteza wydaje się jednak bardzo rozsądna. Ponieważ nie ma innych odpowiedzi, przyjmuję to. –