2012-04-20 11 views
15

Niedawno zacząłem uczyć się perla i mam pytanie, na które nie znajduję jasnej odpowiedzi w Internecie. że mam coś takiego,Sposoby spłaszczania tablicy Perla w kontekście skalarnym

@arr = (1, 2, 3); 
$scal = "@arr" 
# $scal is now 123. 

Czy korzystanie z cytatów jedynym sposobem, aby spłaszczyć tablicy tak, że każdy element jest przechowywany w wartości skalarne? Wydaje się to nieprawdopodobne, ale nie znalazłem żadnych innych sposobów robienia tego. Z góry dziękuję.

Odpowiedz

32

Funkcja join jest powszechnie używana do "spłaszczania" list. Pozwala określić, co chcesz między każdym elementem w wynikowym ciągu.

$scal = join(",", @arr); 
# $scal is no "1,2,3" 
+0

Co jeśli chcesz odrzucić wszystko oprócz pierwszego elementu tablicy, ale bez konieczności wcześniejszego przechowywania tablicy do zmiennej? –

+0

@AlexejMagura: nie ma sensu w kontekście tego pytania.Jeśli chcesz tylko pierwszy element w tablicy, po prostu go weź. Spłaszczanie tylko jednego skalaru nie jest zbyt użyteczne. – Mat

5

Można również użyć join bez separatora

my $scalar = join('' , @array) ; 

Jest więcej niż jeden sposób, aby to zrobić.

+0

Pedantycznie, to nie używa 'join()' bez separatora, używa 'join()' z pustym łańcuchem jako separatorem :-) –

-2

Przeczytaj section Context in perldata. Perl ma dwa główne konteksty: skalar i listę.

Na przykład:

@a = (1, 1, 1); # list context 
print @a;   # list context 
$count = @a;  # scalar context, returns the number of elements in @a 

itp

+2

Nie ma to nic wspólnego z * spłaszczaniem * tablicy. – Borodin

4

w duchu TIMTOWTDI:

my $scal; 
$scal .= $_ foreach @arr; 
13

W przykładzie jesteś interpolację tablicy w podwójnym cudzysłowie. To, co dzieje się w takich okolicznościach, jest kontrolowane przez zmienną Perla o nazwie $". Od perldoc perlvar:

$ LIST_SEPARATOR

$”

Kiedy tablica lub plaster array jest interpolowana w cudzysłowach sznurka lub podobnym kontekście takim jak /.../, jej elementy oddziela się od tej wartości domyślne jest miejsce na przykład,..

print "The array is: @array\n";

odpowiada to:

print "The array is: " . join($", @array) . "\n";

Mnemonik: działa w kontekście podwójnego cytowania.

Domyślną wartością dla $" jest spacja. Oczywiście można zmienić wartość $".

{ 
    local $" = ':', 
    my @arr = (1, 2, 3); 
    my $scalar = "@arr"; # $scalar contains '1:2:3' 
} 

Podobnie jak w przypadku każdej ze zmiennych specjalnych Perla, zawsze najlepiej zlokalizować wszelkie zmiany w bloku kodu.

+0

Ostrzega przed wyrzuceniem, jeśli dowolna wartość w tablicy to 'undef'. Jak to rozwiązać? –

+0

Zależy od tego, co chcesz zrobić. Mogę wymyślić trzy oczywiste alternatywy. 1/Zignoruj ​​ostrzeżenia. 2/Użyj 'grep' na tablicy, aby usunąć niezdefiniowane elementy. 3/Użyj 'map' w tablicy, aby przekonwertować niezdefiniowane elementy na inną wartość (być może pusty ciąg). Jeśli potrzebujesz więcej informacji, powinieneś zadać nowe pytanie. –

Powiązane problemy