Hali!
Egy viszonylag nagy logfájl-t szeretnék átírni egy másik programnak megfelelő formátumra. Ehhez úgygondolom perl a legmegfelelőbb nyelv. Találtam is sok függvényt ehhez, de jó részük csak a kereséssel foglalkozik - nekem ennél kicsit több kéne.Valami olyasmire lenne szükségem mint a PHP explode() függvénye, ami egy adott sztringnél szétvélasztja tömbökbe a sor tartalmát és így azt fel lehetne dolgozni.
Ami még érdekelne az esetleg doksi/könyv/tutor PERL-XML-ről, lehet hogy praktikus lenne minden féle logot XML-be konvertálni (v. adatbázisba feltolni?) és akkor nem lenne gond a sok különböző program által kenerált logokkal.
Köszi a helpet!
- 1945 megtekintés
Hozzászólások
Ha nagyon nagy a file, azt nem szabad egyből memóriába tenni tömbként, mert kifekszik az egész. Rá kell cat-olni egy script-re, ami soronként feldolgozza.
Pl. ez a program minden sor elejére tesz egy sorszámot, a végére meg odaírja, "hogy Hurrá!":
#!/usr/bin/perl
$i =0;
foreach(<>) # iterálunk stdin sorain
{
$i++;
chomp; # sorvégi enter leszedése
print "$i $_ Hurrá!\n"; # $_ változóban van a sor
}
Modjuk nem próbáltam ki, lehet benne hiba.
Azt az XML dolgot ugye nem mondtad komolyan?
- A hozzászóláshoz be kell jelentkezni
man perlfunc, keresd meg a 'split' nevű függvényt, egy regexp szerint vágja a stringet, az eredményt tömbbe teszi.
- A hozzászóláshoz be kell jelentkezni
http://search.cpan.org/search?query=xml&mode=all <- innen tudod kivalasztani a neked megfelelo xml modult.
zsolt
- A hozzászóláshoz be kell jelentkezni
Itt van egy kicsit eggyügyű példa az /etc/passwd file olvasására,
a profik biztosan meg tudnák oldani egy sorban is:
#!/usr/bin/perl -w
my $username = $ENV{'LOGNAME'};
my $emailname = "";
open (PWDFILE, "/etc/passwd") or die "Error opening file: $!";
while (< PWDFILE >) {
my @fields = split(":", $_);
if ($fields[0] eq $username) {
my @namefld = split(",",$fields[4]);
if ($#namefld > -1) {$emailname = $namefld[0];}
else {$emailname = $username;}
}
}
close(PWDFILE) or die "Error closing PWD file: $!";
ELaci
- A hozzászóláshoz be kell jelentkezni
Hát, az open/close miatt három sor :)
open(PWDFILE,'/etc/passwd') || die "Error opening file: $!";
$emailname=(join('',())=~/^$username:(?:[^:]*:){3}([^:]+):/m)?$1:$username;
close(PWDFILE);
- A hozzászóláshoz be kell jelentkezni
Sorry, így:
open(PWDFILE,'/etc/passwd') || die "Error opening file: $!";
$emailname=(join('',<PWDFILE>)=~/^$username:(?:[^:]*:){3}([^:]+):/m)?$1:$username;
close(PWDFILE);
- A hozzászóláshoz be kell jelentkezni
A guru tevékenysége nem biztos hogy üdvözülést hoz mindenki számára, de megdicsőülést a gurunak az qrvára garantálható.
Legyen vele mindenki boldog.
Bocsi...
- A hozzászóláshoz be kell jelentkezni
Én vmiért nem rajongok az ilyen agyba-főbe zsúfolt perl-progikért, az utólagos javítás sokkal egyszerűbb egy lazább, többsoros kódban... szerintem! :]
Ez részben nyelv, részben ember függő is. Ha nem hibázik, akkor biztos praktikusabb a tömör nagyobb alkalmazások esetén.
- A hozzászóláshoz be kell jelentkezni
nem kell izgulni, ez csak _jatek_: http://perlgolf.sourceforge.net/
http://en.wikipedia.org/wiki/Perl_Golf
ne hiszem, hogy ilyen kodot irnak sokan az iparban(kiveve, ha ez a feladat:)
zsolt
- A hozzászóláshoz be kell jelentkezni
Hi!
Ilyen volt regebben ASM-ben, meg sok-sok eve.
Coder-l lista. Sajnos en mar csak az archivumot olvastam, evek mulva, amikor egyebkent a lista mar halott volt. Ha jol remlik, akkor voltak csak a listan feladott feladatok is (a lista moderator/admin a SZIFen oktatott valami ASM-es targyat, es az ott feladott feladatot kellett minel kevesebb byte-ban megirni), illetve volt egy Hugi-Compo is, amirol rendszeresen beszaloltak a listan.
By(t)e
TBS::Antiemes
- A hozzászóláshoz be kell jelentkezni
IMHO egy perl programozonak nincsen ilyen kod olvasasaval problemaja. Ez egy szep, elegans perl kod, amit szivesen latok a programomban :). Perlgolf egy par szintel feljebb van.
- A hozzászóláshoz be kell jelentkezni
Kötözködök csakazértis, mert lemaradt ez: #!/usr/bin/perl -w
viszont ez már szerintem komolytalan:
$emailname=(join('',())=~/^$username:(?:[^:]*:){3}([^:]+):/m)?$1:$username;
ELaci
- A hozzászóláshoz be kell jelentkezni
Tényleg az, mert előtte kellene egy $username=~/^\w+$/ ellenőrzés :)
Egyébként ha rendszeresen kéne _egyedi_ szövegfeldolgozási problémákat megoldanod 4-5 megás text-file-okon (nem log!), nem mondanád, hogy komolytalan, inkább azt mondanád, hogy gyors ;)
- A hozzászóláshoz be kell jelentkezni
Köszi a válaszokat, a "split" fv-t kerestem, csak nem nagyon esett le, hogy ez az.
Az ikszemeles cuccot még átolvasgatom, meg még rendesen meg is kéne tanulni.
- A hozzászóláshoz be kell jelentkezni