2013-07-15 10 views
7

Objaw: $c="foo"; powoduje błąd, a $b="foo"; nie.Perl, zachowanie zmienne, rozbieżność w oparciu o nazwę

Mój skrypt to dosłownie 3 linie. Poniższa produkuje żadnych błędów lub ostrzeżeń
use strict;
$b = "foo";
print $b;
ale jeśli przejść do następującego, otrzymuję „wymaga wyraźnej nazwa pakietu” błąd.
use strict;
$c = "foo";
print $c;,

Rozumiem, że use strict; wymaga zmiennych być zadeklarowane przed użyciem, a zmieniając $c = "foo"; do my $c = "foo"; rzeczywiście zapobiec błąd, ale sam nie wyjaśnia różnicę.

Czy ktoś może rzucić trochę światła tutaj? Jestem pewien, że brakuje mi czegoś oczywistego. Używam Strawberry Perl v5.16.3 w Windows 7 x64. Mam edycji w EJ i wykonywania moich skryptów z linii poleceń, poprzez c:\strawberry> perl test.pl

+6

Ze względu na ich szczególne znaczenie dla 'sort', nigdy nie powinno się używać' $ a 'i' $ b' w twoim kodzie w ogóle, nawet pomijając tę ​​różnicę, którą znalazłeś. – DVK

+0

To brzmi jak dobry nawyk, dzięki DVK. –

Odpowiedz

8

Niektóre zmienne globalne jak $_, $a, $b skutecznie predeklarowany. Dlatego też $a$b zmienne i mogą być stosowane bez dodatkowych oświadczeń w sort bloku, gdzie mają wartości dwóch elementów:

use strict; 
my @nums = (1, 5, 3, 10, 7); 
my @sorted = sort { $a <=> $b } @nums 
+0

Dziękuję, doceniam twoje wyjaśnienie i przykład. Teraz ma to dla mnie sens. –

17

Z dokumentacji strict:

powodu ich szczególnego wykorzystania przez sort(), zmienne $ ai $ b są zwolnione z tego czeku.

+0

Dziękujemy za referencje! Bardzo pomocne. –