Láma napi bölcsessége #2

Vegyük a következő, a valóságtól elrugaszkodott példát:


#!/usr/bin/perl

@file_list = qx(ls -t /path/dir);

foreach(@file_list) {
    open CURRFILE, "<", $_ or die $!;
    while(<CURRFILE>) {
        print $_;
    }
    close CURRFILE;
}

Erre a buta, ökör wannabe noob 1.5 napig töri a fejét, hogy miért kap file does not exist üzenetet...

Kulcsszó?

chomp

!!


#!/usr/bin/perl

@file_list = qx(ls -t /path/dir);

foreach(@file_list) {

    chomp($_);

    open CURRFILE, "<", $_ or die $!;
    while(<CURRFILE>) {
        print $_;
    }
    close CURRFILE;
}

Egyébként picit furának tartom, hogy Perl alatt explicite kell ilyet kérni.

Hozzászólások

aki perllel foglalkozik, az első napon megismeri ezt a parancsot :)
--
\\-- blog --//

A chomp-ot hanyagold, eléggé platformfüggően lett megoldva (össze tudja keverni a három oprendszer különböző sorvégeit, és nem mindig úgy teszi, ahogy elgondolod).

Helyette ez mindig működik: s/\s+$//;. Ez az összes "üres karaktert" törli a sor végéről.

--
Elder Scrolls

Par aprosag, ami talan segit majd a kesobbiekben:

Ha ilyet irsz


for (@array) {
  chomp $_;
  ...
}

annak nem csak a ciklusmagon belul van hatasa, ugyanis a

$_

egy alias az aktualis tombelemre, vagyis megvaltoztattad a tomb elemeit is.

Nincs azzal baj, ha ezt csinalod, csak ebben a formaban konnyen elsiklik folotte az olvaso tekintete, ugyhogy tisztabb, szarazabb erzes ezt irni (a chomp mukodik tombokre is):


chomp( @file_list = qx(ls -t $dir) );

Tovabba a peldad csak akkor fog mukodni, ha a

/path/dir

konyvtarbol futtatod, mert az

ls -t

relativ utvonalakat ad vissza. Ezt is egyszeru kikerulni, peldaul igy:


$dir = '/path/dir';
chomp( @file_list = qx(ls -t $dir) );

for (@file_list) {
  open CURRFILE, "<", "$dir/$_" or die $!;
  ...
}

Plusz a standard mantrak:

-

use warnings;

jelez egy rakas lehetseges hibat

-

use strict;

+ lexikalis (my) valtozok
elkapja az elgepelt valtozoneveket, meg sok minden mast

- lexikalis filehandle:

open my $fh, '<', $file

nem kell expliciten lezarnod a file-jaidat, hanem a perl automatikusan zarja oket, amikor a lexikalis filehandle scope-ja veget er

Azert ez a 'perl majd lezarja' hozzaallas elegge elitelendo szamomra. Inkabb zarja le az ember explicite, minthogy sehogy se legyen lezarva. A szemnek is jobb tud lenni. A lexikalis filehandle inkabb azert jo, mint a tobbi lexikalis valtozo.
Bar, megvallom oszinten, rovid scripteknel nem szeretem a strict-et. Tobb elszallast tud okozni, mintha nem hasznalom. Volt mar olyan, hogy ido hianyaban inkabb toroltem az use strict-et. Nem formazott.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

A Data::Dumper az ember legjobb barátja.
__________________________________
2e845cb4c3a5b5bd6508455b1739a8a2