2013-06-15 9 views
7

W istocie, to ma się na tablicy i utworzenie pojedynczego łańcucha z elementów wspomnianego układu oddzielone linią.przyłączenia() powraca typ następnie przez liczbę szesnastkową zamiast połączonego łańcucha

Mam tablicę o nazwie $zones. Wydanie odwołania do $zones potwierdza, że ​​jest to tablica.

Poniższy kod:

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

wyniki w następujący wynik

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

ja naprawdę nie chcę pętli na tej tablicy ręcznie. Czy ktoś może wyjaśnić, dlaczego funkcja join() zwraca nazwę typu wraz z numerem szesnastkowym?

Odpowiedz

10

Jak to dobrze wyjaśnić przez user1937198, ale dlaczego działa w ten sposób?

To proste:

$zones nie jest tablicą. Jest to odwołanie do tablicy.

join działa na listach. Więc jeśli zrobić:

join("\n",$zones) 

można zasadniczo wzywają join na liście pojedynczego elementu. I element jest referencją, co dzieje się stringify do ARRAY(0x170cf0d8).

Aby to działało poprawnie trzeba dereference nim, a to odbywa się poprzez poprzedzenie z rzeczywistym typem danych (@ lub %, lub w niektórych przypadkach $).

Można to napisać tak: @$zones lub (niektóre, w tym ja, powiedz, że jest bardziej czytelna) jako: @{ $zones }.

Jest to ważne, gdy masz struktur zagnieżdżonych, ponieważ jednocześnie można mieć zwykły tablicę jako zmienną, gdy masz do czynienia z zagnieżdżonych struktur danych, to zawsze referencje.

+1

mam zaznaczone to jako odpowiedź, ponieważ wyjaśnia, dlaczego to działa. Nie wiedziałam, Perl miał pomysł odniesień, więc to wyjaśnienie było bardzo cenne dla mnie. – Fred

5

$zones jest odniesienie tablica i dołączyć do wartości tablicy musisz dereference najpierw poprzedzając skalarnego $zones z @

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

Więcej informacji znajduje się krótki tutorial referencje : http://perldoc.perl.org/perlreftut.html#NAME

Powiązane problemy