2013-06-15 7 views
7

In sostanza, voglio prendere un array e creare una stringa singola con gli elementi di detto array separati da una nuova riga.La funzione join() restituisce il tipo seguito da un numero esadecimale invece di una stringa concatenata

Ho una matrice denominata $zones. L'output del riferimento a $zones conferma che si tratta di un array.

Il seguente codice:

print_log(Dumper($zones)); 
print_log('-------'); 
print_log(Dumper(join("\n",$zones))); 

risultati nel seguente output

[2013-06-15 16:23:29 -0500] info [dnsadmin] $VAR1 = [ 
      'fake.com25', 
      'fake.com2', 
      'fake.com27', 
      'fake.com43', 
      'fake.com41', 
      'fake.com40', 
      'fake.com39', 
      'fake.com37', 
      'fake.com36', 
      'fake.com35', 
      'fake.com31', 
      'fake.com56', 
      'fake.com55', 
      'fake.com54', 
      'fake.com53', 
      'fake.com52', 
      'fake.com51', 
      'fake.com50', 
      'fake.com49', 
      'fake.com48', 
      'fake.com42', 
      'fake.com38', 
      'fake.com34', 
      'fake.com33', 
      'fake.com32', 
      'fake.com30', 
      'fake.com29', 
      'fake.com28', 
      'fake.com26', 
      'fake.com24', 
      'fake.com23', 
      'fake.com69', 
      'fake.com68', 
      'fake.com67', 
      'fake.com66', 
      '0', 
      'fake.com44', 
      'fake.com45', 
      'fake.com46', 
      'fake.com278' 
     ]; 

[2013-06-15 16:23:29 -0500] info [dnsadmin] ------- 
[2013-06-15 16:23:29 -0500] info [dnsadmin] $VAR1 = 'ARRAY(0x170cf0d8)'; 

Io davvero non voglio un ciclo su questo array manualmente. Qualcuno può spiegare perché la funzione join() sta restituendo il nome del tipo insieme a un numero esadecimale?

risposta

10

Come si spiega bene l'utente 1937198, ma perché funziona in questo modo?

È semplice:

$zones non è un array. È un riferimento di matrice.

join funziona su elenchi. Quindi, se si fa:

join("\n",$zones) 

Essenzialmente si sta chiamando join in un elenco singolo elemento. E l'elemento è un riferimento, che capita di stringificare a ARRAY(0x170cf0d8).

per farlo funzionare correttamente è necessario dereferenziarlo, ed è fatto anteponendo con tipo di dati reali (@ o %, o in alcuni casi $).

Questo può essere scritto in questo modo: @$zones o (alcuni, incluso me, dire che è più leggibile) come: @{ $zones }.

Questo è importante quando si hanno strutture nidificate, perché mentre si può avere matrice semplice come variabile, quando si ha a che fare con strutture di dati annidate, sono sempre riferimenti.

+1

Ho contrassegnato questo come la risposta poiché ha spiegato perché funziona. Non mi rendevo conto che PERL aveva l'idea di riferimenti, quindi questa spiegazione è stata molto preziosa per me. – Fred

6

quello che vuoi è join("\n",@{$zones}))

5

$zones è di riferimento array e di unirsi valori di matrice si deve dereferenziarlo prima anteponendo scalare $zones con @

print_log(Dumper(join("\n",@$zones))); 

Per maggiori informazioni v'è breve tutorial su riferimenti : http://perldoc.perl.org/perlreftut.html#NAME

Problemi correlati