Wyszukiwanie plików za pomocą Perla

File::Find i wanted podprogram

To 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ąfind2perlwyjś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.

questionAnswers(3)

yourAnswerToTheQuestion