Podczas próby przypisania zmiennej i przetestowania jej pod kątem zdefiniowania w jednej operacji w Perlu, jak byłoby to przydatne na przykład w stanie if
, wydaje mi się naturalne, że napisać:Zrozumienie pierwszeństwa przy przypisywaniu i testowaniu definiowalności w Perl
if (defined my $thing = $object->get_thing) {
$thing->do_something;
}
Jeśli chodzi o moje rozumienie idzie, defined
ma pierwszeństwo w rightward list operator, która jest niższa niż w przypadku zadania, dlatego spodziewałbym mój kod powyżej, aby być równoważne:
if (defined (my $thing = $object->get_thing)) {
$thing->do_something;
}
Podczas gdy drugi, kod z nawiasami działa, ten pierwszy powoduje następujący błąd krytyczny: "Nie można zmodyfikować zdefiniowanego operatora w przypisaniu skalarnym".
Nie trzeba dodawać nawiasów, ale chciałbym zrozumieć, dlaczego pierwsza wersja nie działa, np. jaka jest "rzecz" defined
i jakie jest jej pierwszeństwo?
Czy wiesz, co decyduje, że 'określony' ma wyższy priorytet niż przypisanie? Na przykład 'print my $ test = 'test'' drukuje" test ". – scozy
Zaktualizowałem moją odpowiedź. – ikegami
@scozy: nie myśl o "moim" jako operator z pierwszeństwem. Słowo kluczowe "moje" wywołuje specjalne przetwarzanie. – gensym