Moduł File::Basename

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Spis treści

  1. Co to jest
  2. Krótki program
  3. Opis funkcji
    1. fileparse()
    2. basename()
    3. dirname()
    4. fileparse_set_fstype()
  4. Dodatkowe informacje
  5. Autorka opisu

Co to jest

Moduł File::Basename, jest bardzo krótki, jednakże przydatny jeżli chcemy ze ścieżki do pliku wyciągnąć jej poszczególne składowe: ścieżkę, pełną nazwę pliku wraz z rozszerzeniem, samą nazwę pliku, bądź też samo rozszerzenie.

Krótki program

#!/usr/bin/perl -wl use File::Basename; $path = '/to/jest/sciezka/nazwa_pliku.rozszerzenie'; $file = basename($path); $dir = dirname($path); ($name,$dir,$ext) = fileparse($path,'\..*'); print "Sciezka: $dir.\nNazwa pliku z rozszerzeniem: $file.\nNazwa pliku: $name.\nRozszerzenie: $ext\n";

Efekt działania powyższego programu będzie następujący:


A teraz opiszmy co się stało.

Opis funkcji

Możemy korzystać z następujących funkcji:

fileparse()

Funkcja ta parsuje ścieżkę, którą otrzyma jako parametr wywołania i "wyciąga" poszczególne składowe.

Mamy dany przykładowy program:
#!/usr/bin/perl -wl use File::Basename; $path = '/to/jest/sciezka/nazwa_pliku.rozszerzenie'; ($filename, $directories, $suffix) = fileparse($path); print "0.filename $filename, directories $directories, suffix: $suffix"; ($filename1, $directories1, $suffix1) = fileparse($path, '\..*'); print "1.filename $filename1, directories $directories1, suffix: $suffix1"; $filename2 = fileparse($path, '\..*'); print "2.filename $filename2";
Który w efekcie da:


Nie trudno zauważyć różnicę pomiędzy tymi trzema przykładami. Każdy działa inaczej w zależności od tego do czego przypisujemy wynik działania funkcji fileparse() (czy jest to lista zmiennych, czy pojedyncza zmienna), oraz jakie parametry podajemy funkcji - czy jest to same $path, czy też spercyzowane wyrażeniem regularnym rozszerzenie.

A teraz czas na opisanie niezaprzeczalnych plusów tej funkcji, które odróżniają ją chociażby od funkcji basename(). Rozważmy tutaj dwa przyklady:

#!/usr/bin/perl -wl use File::Basename; ($filename, $directories, $suffix) = fileparse("/to/jest/sciezka/a_to_plik_bez_rozszerzenia"); print "1.filename $filename, directories $directories, suffix: $suffix"; ($filename1, $directories1, $suffix1) = fileparse("/to/jest/sciezka/a_to_katalog/"); print "2.filename $filename1, directories $directories1, suffix: $suffix1";

Otrzymujemy:
1.filename a_to_plik_bez_rozszerzenia, directories /to/jest/sciezka/, suffix:
2.filename , directories /to/jest/sciezka/a_to_katalog/, suffix:

Jak widać funkcja ta działa zgodnie z oczekiwaniami - jeśli plik na końcu ścieżki nie ma rozszerzenia jak w pierwszym przykladzie, to zostanie wypisana jego nazwa i resztka ścieżki.
Jeśli na koncu ścieżki jest katalog jak w drugim przykładzie to nazwa pliku pozostanie pusta jak również jego rozszerzenie.

basename()

Funkcja ta oddziela katalog i przyrostek od nazw plików.
Działa ona analogicznie do shellowej funkcji basename.
Usuwa ona wiodące nazwy katalogów z pełnej nazwy, pozostawiając w ten sposób nazwę pliku bez ścieżki.

Niestety wbrew oczekiwaniom funkcja ta nie zawsze zwraca nazwę pliku (dlatego też bezpieczniej jest używać funkcji fileparse() ), gdyż np. mając ścieżkę:
$path = '/to/jest/sciezka/';
używając funkcji basename($path) otrzymamy 'sciezka' mimo, iż jest to katalog, a nie nazwę pliku, o którą nam chodzilo.

Dodatkowo należy także zauważyć, iż jeśli podano przyrostek i jest on identyczny z końcem nazwy, to jest on także usuwany.

Istnieją oczywiście sytuacje, kiedy nie ma różnicy zasadniczej między tym, czy użyjemy funkcji basename(), czy też funkcji fileparse(). Bowiem, po wykonaniu kodu:

#!/usr/bin/perl -wl use File::Basename; $filename = basename("/to/jest/sciezka/nazwa_pliku.rozszerzenie", ".rozszerzenie"); print "1Filename: $filename"; $filename2 = fileparse("/to/jest/sciezka/nazwa_pliku.rozszerzenie", qr/.rozszerzenie/); print "2Filename: $filename2";
otrzymujemy taki sam rezultat.

dirname()

Jest to funkcja usuwająca niekatalogowy przyrostek nazwy pliku, działająca analogicznie do shellowej instrukcji dirname().
Niestety tak samo jak basename() zawiera pewnego rodzaju "usterki", dlatego też niejednokrotnie pewniej jest stosowac zamiast niej funkcję fileparse().

Rozważmy następujący program:

#!/usr/bin/perl -wl use File::Basename; $dir1 = dirname("/kat1/kat2/plik_bez_rozszerzenia"); print "1.Dir1 z dirname: $dir1"; ($filename, $dir1) = fileparse("/kat1/kat2/plik_bez_rozszerzenia"); print "2.Dir1 z fileparse: $dir1"; $dir2 = dirname("/kat1/kat2/kat3/"); print "3.Dir2 z dirname: $dir2"; ($filename, $dir2) = fileparse("/kat1/kat2/kat3/"); print "4.Dir2 z fileparse: $dir2"; $dir3 = dirname("katalog/"); print "5.Dir3 z dirname: $dir3";

W wyniku daje on nam:
[mmachows@manta][moduly]:D perl basename3.pl
1.Dir1 z dirname: /kat1/kat2
2.Dir1 z fileparse: /kat1/kat2/
3.Dir2 z dirname: /kat1/kat2
4.Dir2 z fileparse: /kat1/kat2/kat3/
5.Dir3 z dirname: .

Widzimy iż istnieje róznica pomiędzy działaniem obu funkcji.
Funkcja basename(), w przeciwieństwie do fileparse():
- po ostatnim katalogu nie wypisuje '/' (przykłady 1. i 2.),
- gdy na koncu znajduje się nie plik bez rozszerzenie, tylko katalog (przykłady 3. i 4.) to funkcja dirname() traktuje ten ostatni katalog jak plik bez rozszerzenia
- w przypadku ścieżki składającej się z jednego katalogu zostaje wypisane '.' (przykład 5).

fileparse_set_fstype()

Normalnie moduł File::Basement przyjmuje typ ścieżki w zależności od systemu operacyjnego na którym pracujemy np. /kat1/plik w systemach Unixowych lub też \kat1\plik na Windowsach.
Natomiast dzięki tej funkcji możemy zastąpić typ na inny.

#!/usr/bin/perl -wl use File::Basename; $type = fileparse_set_fstype(); print "Type: $type"; $type = fileparse_set_fstype('MSWin32'); $previous_type = fileparse_set_fstype($type); print "Previous Type: $previous_type";

spowoduje wypisanie:
[mmachows@manta][moduly]:D perl basename4.pl
Type: Unix
Previous Type: MSWin32

Dodatkowe informacje

Więcej na temat tego modułu dowiesz się odwiedzając stronę: http://search.cpan.org/~nwclark/perl-5.8.8/lib/File/Basename.pm.

Autorka opisu

M.M.

Uniwersytet Gdański - Instytut Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.