programowanieBackend developer

Jakie są sposoby organizacji i importowania modułów w Perl? Jak działa system @INC i use/require? Podaj przykład tworzenia i podłączania własnego modułu.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

Do organizacji kodu w Perl używa się modułów (packages), które są zapisane w oddzielnych plikach z rozszerzeniem .pm.

  • Do podłączania modułu używa się use (na etapie kompilacji) i require (na etapie wykonania).
  • Podczas wyszukiwania modułu Perl korzysta z specjalnej tablicy @INC — jest to lista katalogów, w których Perl szuka modułów.

Przykład modułu:

Foo.pm

package Foo; use strict; use warnings; sub say_hello { print "Hello from Foo! "; } 1;

Podłączenie i użycie:

use lib '.'; # Dodaje bieżący folder do @INC use Foo; Foo::say_hello(); # Wyświetla: Hello from Foo!

Główne różnice:

  • use importuje moduł na początku wykonania skryptu i automatycznie wywołuje metodę import, jeśli takowa istnieje.
  • require ładował moduł tylko przy pierwszym wywołaniu.

Pytanie z pułapką

Jaka jest różnica między use a require? Kiedy używać którego operatora?

Odpowiedź:

  • use — działa na etapie kompilacji, automatycznie wywołuje import (zazwyczaj stosowane dla modułów).
  • require — działa w czasie wykonywania, potrzebne, gdy nazwa modułu jest nieznana przed wykonaniem lub gdy nie zawsze trzeba go podłączać.

Przykłady rzeczywistych błędów spowodowanych nieznajomością szczegółów tematu


Historia

W dużym projekcie podłączono własną bibliotekę przez require, zapominając, że używa ona funkcji eksportowanych. Używana funkcja nie została wyeksportowana, ponieważ require nie wywołuje import. Wynik — nie działa import symboli, trzeba wywoływać funkcje jawnie.


Historia

Podczas przenoszenia modułu do oddzielnego folderu zapomniano dodać ścieżkę do folderu przez use lib lub zmienić zmienną @INC. Moduł nie był znajdowany, skrypt kończył się błędem, mimo że plik znajdował się we właściwym miejscu względem projektu.


Historia

W starym aplikacji nazwano moduł małą literą, a podłączono przez use z wielką: use foo; zamiast use Foo;. Perl nie znalazł modułu, co spowodowało zakłócenie działania krytycznych części aplikacji.