Wyszukiwanie plików za pomocą Perla
File::Find
i wanted
podprogramTo pytanie jest znacznie prostsze niż oryginalny tytuł („prototypy i deklaracja podprogramów”!). Mam nadzieję, że odpowiedź, jakkolwiek prosta, pomoże mi zrozumieć podprogramy / funkcje, prototypy i zakres orazFile::Find
moduł.
W Perlu podprogramy mogą pojawiać się niemal wszędzie i normalnie nie musisz wysyłać deklaracji do przodu (z wyjątkiem sytuacji, gdy sub deklaruje prototyp, którego nie wiem, jak to zrobić w „standardowy” sposób w Perlu). Z powodu tego, co zwykle robię z Perlem, istnieje niewielka różnica między tymi różnymi sposobami uruchamianiasomefunction
:
sub somefunction; # Forward declares the function
&somefunction;
somefunction();
somefunction; # Bare word warning under `strict subs`
Często używamfind2perl
wygenerować kod, który szufladę / włamuję do części skryptów. To może być zły styl, a teraz moje brudne pranie jest publiczne, ale niech tak będzie :-)File::Find
wanted
funkcja jest wymaganym podprogramem -find2perl
tworzy go i dodajesub wanted;
do tworzonego skryptu. Czasami, gdy edytuję skrypt, usuwam „sub
" zsub wanted
i kończy się tak&wanted;
lubwanted();
. Ale bezsub wanted;
formularz zgłoszenia do przodu Otrzymuję to ostrzeżenie:
Use of uninitialized value $_ in lstat at findscript.pl line 29
Moje pytanie brzmi: dlaczego tak się dzieje i czy jest to prawdziwy problem? To „tylko ostrzeżenie”, ale chcę to lepiej zrozumieć.
Dokumentacja i kod mówią$_
jest zlokalizowany wewnątrzsub wanted {}
. Dlaczego miałbym być niezdefiniowany, jeśli użyjęwanted();
zamiastsub wanted;
?Jestwanted
używać gdzieś prototypów? Czy brakuje mi czegoś oczywistegoFind/File.pm
?Czy to dlategowanted
zwraca odwołanie do kodu? (???)Domyślam się, że formularz deklaracji „inicjalizuje”wanted
w pewien sposób, aby pierwsze użycie nie miało pustej zmiennej domyślnej. Sądzę, że w ten sposób działałyby również prototypy - nawet prototypy Perla, takie jakie istnieją. Próbowałem przejść przez kod źródłowy Perla, aby dowiedzieć się, cosub
robi, gdy funkcja jest wywoływana za pomocąsub function
zamiastfunction()
, ale w tym momencie może to być poza mną.
Jakakolwiek pomoc w pogłębianiu (i przyspieszaniu) mojego rozumienia tego jest bardzo doceniana.
EDYTOWAĆ: Tutaj jestostatni przykładowy skrypt tutaj na Stack Overflow które stworzyłem za pomocąfind2perl
wyjście. Jeśli usunieszsub
zsub wanted;
powinieneś otrzymać ten sam błąd.
EDYTOWAĆ: Jak zauważyłem w komentarzu poniżej (ale zaznaczę to również tutaj): przez kilka miesięcy używałemPath::Iterator::Rule
zamiastFile::Find
. To wymagaperl >5.10
, ale nigdy nie muszę wdrażać kodu produkcyjnego w witrynach z dziwnym „nigdy nie aktualizuj”,5.8.*
tylko polityki takPath::Iterator::Rule
stał się jednym z tych modułów, których nigdy nie chcę robić. Użyteczne jest równieżPath::Class
. Twoje zdrowie.