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?
Czy możesz podać link do źródła? – simbabque
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;'' –
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