Chciałbym wykonać pewne zawiłe wariacje zadania @a = @b || @c
, z zamiarem podjęcia @b
, jeśli nie jest pusty (stąd prawda w sensie boolean), @c
w przeciwnym razie. Dokumentacja wyraźnie mówi mi, że nie mogę. (I to jest prawda o tym, też!)Dlaczego nie mogę przypisać @b || @ c do @a w Perlu?
W "||", "//" i "& &" podmioty zwróci ostatnią wartość oceniana (w przeciwieństwie do C w "||" i "& & ", które zwracają 0 lub 1).
[...]
W szczególności oznacza to, że nie należy korzystać z tego wyboru między dwa agregaty do przypisania:
@a = @b || @c; # this is wrong @a = scalar(@b) || @c; # really meant this @a = @b ? @b : @c; # this works fine, though
Niestety, to nie naprawdę robi Powiedz mi dlaczego.
Czego spodziewać by się stało, było to:
@a =
jest przypisanie tablicy, wywołując kontekst listy po prawej stronie.@b || @c
to prawa strona, do oceny w kontekście listy.||
jest logicznym lub logicznym zwarciem w stylu C. Ocenia od lewej do prawej (w razie potrzeby) i propaguje kontekst.@b
jest oceniany w kontekście listy. Jeśli wartość true (, tj., niepusta), jest zwracana.- jeśli nie,
@c
jest również obliczany w kontekście listowym i zwracany.
Oczywiście, moje przedostatnie stwierdzenie jest błędne. Czemu? I, co ważniejsze, która część dokumentacji lub źródeł uwzględnia to zachowanie?
PS: poza zakresem pytania, powód, dla którego rezygnuję z sugestii dokumentacji dotyczącej korzystania z operatora trójargumentowego, jest taki, że mój @b
jest rzeczywiście tymczasowy (wynik wywołania funkcji).
Linia, która mówi "naprawdę znaczy to", wyjaśnia dlaczego. –
To więcej niż dlaczego dla mnie. Ale jestem stronniczy. –
Raczej uważam, że komentarz "naprawdę tak" powinien zostać zmieniony na "naprawdę znaczy to". Tak jak było, spodziewałem się, że zmiana skalarna() zmieni się na @a równą @b - czyli tym, co autor naprawdę MUSI użyć - co oczywiście nie jest prawdą. Zamiast tego pierwsza linia naprawdę oznacza drugą linię; obaj uzyskują taki sam wynik, co nie jest pożądaną odpowiedzią. – Rini