Jak zapisać zawartość folderu do tablicy w Perl'u


(macia60@op.pl) #1

Witam.

Jak w temacie, muszę zapisać zawartość folderu /var/mail do tablicy asocjacyjnej.

Niestety uczę się dopiero perla i to mnie trochę przerosło bo w kursach opisane jest tylko wczytywanie z pliku. ;/


(Sawyer47) #2

Najprościej chyba będzie użyć składni co da wszystkie nieukryte pliki z katalogu mail. Zobacz http://perldoc.perl.org/functions/glob.html


(macia60@op.pl) #3

!/usr/bin/perl

open(UCHWYT,'/var/mail') or die "Nie można otworzyć pliku: $!";

%linie = ; # czytanie do tablicy

close (UCHWYT);

print %linie; # drukowanie tablicy

Taki mam kod ale jak zrobie tak jak proponujesz open(UCHWYT,'/var/mail/*') to wyskakuje błąd, że nie ma takiego katalogu... ;/


(Sawyer47) #4

Nie proponuję czegoś co napisałeś. Kliknąłeś chociaż w link, który podałem? Jeśli chcesz dostać nazwy plików z katalogu /var/mail/ to dostaniesz je za pomocą operatora <> (a jest to po prostu inny sposób wywołania funkcji glob)

my @files = /mail/*>;

(macia60@op.pl) #5

my @linie = /mail/*>;

close (linie);

print @linie; # drukowanie tablicy

Zrobiłem coś takiego i faktycznie zadziałało.

Wielkie dzięki.


(Sawyer47) #6

A po co i czemu ma służyć

close (linie);

Nie otwierasz jawnie żadnego uchwytu pliku, nie ma więc potrzeby wywoływać close. Polecam też używać "use strict;" i "use warnings", tak na przyszłość.


(macia60@op.pl) #7

Dzięki za rady :slight_smile: niestety piszę w perlu od tygodnia i nie wiem nawet jak tego (use strict;" i "use warnings) użyć.

Mam jeszcze pytanie, jak teraz tą tablicę przetworzyć żeby wyświetlało same nazwy? (tu mam wycinek z wydruku):

/var/mail/wiolusiak/var/mail/wisla/var/mail/wislak/var/mail/witol/var/mail/wizard6/var/mail/wizzard/var/mail/wkrolik/var/mail/wodnik

Wiem, że trzeba użyć wyrażenia regularnego. Tylko jak i w krórym miejscu?


(Sawyer47) #8

Same nazwy plików, bez /var/mail? No to wystarczy użyć substr do wydobycia podciągu znaków, wyrażenia regularne w tym przypadku to przesada.

substr: http://perldoc.perl.org/functions/substr.html


(macia60@op.pl) #9

;/ niestety muszę zastosować w.regularne.

Ale sprawdzę też ten sposób.

Dzięki za cierpliwość i wyrozumiałość.

-- Dodane 11.06.2011 (So) 22:20 --

!/usr/bin/perl

my @linie = /mail/*>;

print @linie; # drukowanie tablicy

my @l =substr @linie, 10;

print @linie;

napisałem takie coś ale nie działa, nie widzę niestety błędu, który popełniam :frowning:


(Sawyer47) #10

substr działa na napisach. A Ty masz tablicę napisów. Operację musisz wykonywać na elemencie tablicy, a nie na niej samej. Przy okazji użycie use strict i use warnings, więcej o nich w perldoc.

#!/usr/bin/perl


use strict;

use warnings;


my @linie = /mail/*>;


my @l = map { substr $_, 10 } @linie;


print $_, "\n" for @l;

(macia60@op.pl) #11

no faktycznie dużo łatwiej niż przez wyrażenie reg. ale czy teraz da się jakoś sprawdzic czy są zalogowani np przez komendę who lub w ? i wypisac osoby zalogowanej osoby mail ?