LINUXSOFT.cz
Nazwa użytkownika: Hasło:     
    CZ UK PL

> Komentarze :: článek Perl (42) - Argumenty příkazového řádku

Tenhle díl se trochu nepovedl 20.9.2006 10:31
Hynek (Pichi) Vychodil
Na můj vkus je v příkladech trošku moc překlepů a hned v tom prvním
$ perl 
use strict;
for (@ARGV){
    next unless -e $arg;
}
Global symbol "$arg" requires explicit package name at - line 3.
Execution of - aborted due to compilation errors.
A stejná chyba se nám dílem vine jako pověstná červená nit. No a potom trocha elegance by taky neuškodila. Když mám zjišťovat typ souboru, tak jde použít naposledy zjišťovaný typ (ono to bude i rychlejší)
sub ziskej_typ_souboru {
    my($soubor) = @_;
if (-d $soubor){return "d";} #adresář elsif (-l _ ){return "l";} #symbolický odkaz elsif (-f _ ){return "-";} #obyčejný soubor elsif (-p _ ){return "p";} #roura elsif (-b _ ){return "b";} #blokový elsif (-c _ ){return "c";} #znakový elsif (-S _ ){return "s";} #socket else {return "?";} #neznamý }
Dovedeno ad absurdum optimalizováno na rychlost
sub ziskej_typ_souboru ($) {
        -d $_[0] && 'd' #adresář
    ||  -l _     && 'l' #symbolický odkaz
    ||  -f _     && '-' #obyčejný soubor
    ||  -p _     && 'p' #roura
    ||  -b _     && 'b' #blokový
    ||  -c _     && 'c' #znakový
    ||  -S _     && 's' #socket
    ||              '?' #neznamý
}
Ale proč vlastně, když stat nám tuto informaci poskytne také? Stačí si jen přečíst nápovědu ke stat a máme to i znávodem. No a v neposlední řadě to zpracování práv, to už my málem vyrazilo dech. Co to jako má být to převádění na oktalové číslo? Slyšel někdy autor o binárních maskách. Vždyť to proboha už je v tom nejlepším možném tvaru se kterým se tak krásně a jednoduše pracuje.
#!/usr/bin/env perl
use strict;
use warnings;
use Fcntl ':mode';
use POSIX qw(strftime);
sub ziskej_typ_a_prava ($) { local $_ = $_[0]; ( S_ISDIR($_) && 'd' #adresář || S_ISLNK($_) && 'l' #symbolický odkaz || S_ISREG($_) && '-' #obyčejný soubor || S_ISFIFO($_) && 'p' #roura || S_ISBLK($_) && 'b' #blokový || S_ISCHR($_) && 'c' #znakový || S_ISSOCK($_) && 's' #socket || '?' #neznamý ) .( $_ & S_IRUSR && 'r' || '-') #cteni vlastnik .( $_ & S_IWUSR && 'w' || '-') #zapis vlastnik .( $_ & S_ISUID #setuid && ($_ & S_IXUSR && 's' || 'S') || $_ & S_IXUSR && 'x' || '-' #exekuce vlastnik ) .( $_ & S_IRGRP && 'r' || '-') #cteni skupina .( $_ & S_IWGRP && 'w' || '-') #zapis skupina .( $_ & S_ISGID #setgid && ($_ & S_IXGRP && 's' || 'S') || $_ & S_IXGRP && 'x' || '-' #exekuce skupina ) .( $_ & S_IROTH && 'r' || '-') #cteni ostatni .( $_ & S_IWOTH && 'w' || '-') #zapis ostatni .( $_ & S_ISVTX #sticky && ($_ & S_IXOTH && 't' || 'T') || $_ & S_IXOTH && 'x' || '-' #exekuce ostatni ) }
@ARGV = <*> unless @ARGV; for (@ARGV) { next unless -e; my ( undef, undef, $mode, $odkazu, $uid, $gid, undef, $velikost, undef, $mtime ) = stat; printf "%10s %3s %7s %7s %10d %16s %s\n", ziskej_typ_a_prava $mode, $odkazu, scalar getpwuid $uid, scalar getgrgid $gid, $velikost, strftime("%Y-%m-%d %H:%M", localtime($mtime)), $_; }
P.S.: A proč mi ten engine žere prázdné řádky?
Re: Tenhle díl se trochu nepovedl 21.9.2006 10:44
Hynek (Pichi) Vychodil
Méně knihoven, více práce s maskami a trošku rychlejší.
#!/usr/bin/env perl
use strict;
use warnings;
sub get_by_mask ($@) { my $mask = shift; for my $type (@_) { ($_ & $mask) == $mask && return $type } continue { $mask <<= 1 } () # vraceni niceho }
sub ziskej_typ ($) { local $_ = $_[0]; ($_ & 0xa000) == 0xa000 && 'l' #link || get_by_mask(0x6000, qw(b s)) #blokove zarizeni nebo socket || get_by_mask(0x1000, qw(p c d -)) #normalni typy || '?' #neznamy }
sub ziskej_prava ($) { my $suidmask = 04000; my $rightmask = 0400; my $res = ''; for (qw(s s t)) { for (qw(r w)) { $res .= $_[0] & $rightmask && $_ || '-'; # cteni a zapis } continue { $rightmask >>= 1; } $res .= $_[0] & $suidmask # suid a sticky && ($_[0] & $rightmask && $_ || uc) || $_[0] & $rightmask && 'x' || '-'; # exekuce $rightmask >>= 1; # dorovnani tretiho prubehu } continue { $suidmask >>= 1; } $res # vysledek }
sub zjisti_cas ($) { my (undef, $min, $hour, $mday, $mon, $year) = localtime($_[0]); sprintf "%4d-%02d-%02d %02d:%02d", $year + 1900, $mon, $mday, $hour, $min }
@ARGV = <*> unless @ARGV; for (@ARGV) { next unless -e; my ( undef, undef, $mode, $odkazu, $uid, $gid, undef, $velikost, undef, $mtime ) = stat; printf "%1s%9s %3s %7s %7s %10d %16s %s\n", ziskej_typ $mode, ziskej_prava $mode, $odkazu, getpwuid($uid) || $uid, getgrgid($gid) || $gid, $velikost, zjisti_cas $mtime, $_; }
Re: Tenhle díl se trochu nepovedl 21.9.2006 11:07
Hynek (Pichi) Vychodil
Další pěkná a elegantní varianta
#!/usr/bin/env perl
use strict;
use warnings;
sub ziskej_typ () { -f && '-' #obyčejný soubor (radši nebudu spoléhat na -e u next unless) || -d _ && 'd' #adresář || -l && 'l' #symbolický odkaz (-l vyžaduje lstat) || -p _ && 'p' #roura || -b _ && 'b' #blokový || -c _ && 'c' #znakový || -S _ && 's' #socket || '?' #neznamý }
sub ziskej_prava ($) { my $suidmask = 04000; my $rightmask = 0400; my $res = ''; for (qw(s s t)) { for (qw(r w)) { $res .= $_[0] & $rightmask && $_ || '-'; # cteni a zapis } continue { $rightmask >>= 1; } $res .= $_[0] & $suidmask # suid a sticky && ($_[0] & $rightmask && $_ || uc) || $_[0] & $rightmask && 'x' || '-'; # exekuce $rightmask >>= 1; # dorovnani tretiho prubehu } continue { $suidmask >>= 1; } $res # vysledek }
sub zjisti_cas ($) { my (undef, $min, $hour, $mday, $mon, $year) = localtime($_[0]); sprintf "%4d-%02d-%02d %02d:%02d", $year + 1900, $mon, $mday, $hour, $min }
@ARGV = <*> unless @ARGV; for (@ARGV) { next unless -e; my ( undef, undef, $mode, $odkazu, $uid, $gid, undef, $velikost, undef, $mtime ) = stat; printf "%1s%9s %3s %7s %7s %10d %16s %s\n", ziskej_typ, ziskej_prava $mode, $odkazu, getpwuid($uid) || $uid, getgrgid($gid) || $gid, $velikost, zjisti_cas $mtime, $_; }

KOMENTARZE
Tenhle díl se trochu nepovedl 20.9.2006 10:31 Hynek (Pichi) Vychodil
  |- Re: Tenhle díl se trochu nepovedl 21.9.2006 10:44 Hynek (Pichi) Vychodil
  L Re: Tenhle díl se trochu nepovedl 21.9.2006 11:07 Hynek (Pichi) Vychodil
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
> Szukanie oprogramowania
1. Pacman linux
Download: 4875x
2. FreeBSD
Download: 9063x
3. PCLinuxOS-2010
Download: 8561x
4. alcolix
Download: 10943x
5. Onebase Linux
Download: 9659x
6. Novell Linux Desktop
Download: 0x
7. KateOS
Download: 6240x

1. xinetd
Download: 2411x
2. RDGS
Download: 937x
3. spkg
Download: 4755x
4. LinPacker
Download: 9961x
5. VFU File Manager
Download: 3196x
6. LeftHand Mała Księgowość
Download: 7201x
7. MISU pyFotoResize
Download: 2806x
8. Lefthand CRM
Download: 3561x
9. MetadataExtractor
Download: 0x
10. RCP100
Download: 3117x
11. Predaj softveru
Download: 0x
12. MSH Free Autoresponder
Download: 0x
©Pavel Kysilka - 2003-2024 | mailatlinuxsoft.cz | Design: www.megadesign.cz