2015-09-07 6 views
11

Rozważ następujące programy w Perlu.Dlaczego w narzędziu Perl wyświetlana jest lista undef, która nie jest wartością tylko do odczytu lub stałą?

use strict; 
use warnings; 

my @foo = qw(a b c); 
undef = shift @foo; 

print scalar @foo; 

to umrze z komunikatem o błędzie:

Modification of a read-only value attempted at ...

Korzystanie z constat da inny błąd:

1 = shift @foo; 

Can't modify constant item in scalar assignment at ...
Execution of ... aborted due to compilation errors.

To samo, jeśli robimy to:

(1) = shift @foo; 

Wszystko to ma dla mnie sens. Ale wstawienie undef na liście będzie działało.

(undef) = shift @foo; 

Teraz drukuje 2.

Oczywiście jest to powszechną praktyką, jeśli masz kilka wartości zwracanych i chcą tylko konkretne te, jak tutaj:

my (undef, undef ,$mode, undef ,$uid, $gid, undef ,$size) = stat($filename); 

The 9th linia przykład kodu w perldoc -f undef pokazuje to, butthere ma wyjaśnieniu.

Moje pytanie brzmi: w jaki sposób jest to obsługiwane wewnętrznie przez Perla?

Odpowiedz

10

Wewnętrznie, Perl ma różnych operatorów do przypisywania skalarnego i przypisywania list, mimo że oba są w kodzie źródłowym napisane jako =. A operator przypisania listy ma specjalny przypadek dotyczący undef, o który pytasz.

+0

Czy możesz podać link do źródła? – simbabque

+3

Do czego dokładnie? Kod źródłowy Perla nie jest dokładnie prosty. Możesz spojrzeć na https://github.com/Perl/perl5/blob/blead/op.c i wyszukać 'op_sassign' i' op_aassign', jeśli to pomaga. Lub, prawdopodobnie bardziej przydatny, zobacz skompilowany kod bajtowy, wykonując coś takiego: 'perl -MO = Terse -E '(undef) = 1;'' –

+0

Przepraszam, powinienem był sformułować to inaczej. Chodziło mi o to, czy możesz podać coś, co poparłoby to wyjaśnienie? Ponieważ nie łączyłeś się z dokumentacją mówiącą, że zakładałem, że szukałeś jej gdzieś indziej, najprawdopodobniej źródłem. :) – simbabque

Powiązane problemy