[ Free_Sex @ 02.02.2004. 19:35 ] @
Imam problema sa doticnom ... evo coda ;

Code:

#!perl
print "Just started !\n ";
open (in,"ip-to-country.csv");
@file=<in>;
close in;
open (out,"+<ip-twoletters.bin");
open (out2,">ip-country.dat");
$space="        ";
foreach $line (@file){
    chop($line);
    ($start,$end,$twoletters,$treeletters,$country)=split(/\Q","\E/,$line);
    chop($country);
    $start = substr($start,1);
    $zaupis = join (";",$start, $end ,$twoletters);
    syswrite (out,$zaupis,30);
    print out2 $twoletters ,";", $treeletters ,";", $country ,"\n";
}
print "All Finished ! \n";
close out;
close out2;


Dakle ja hocu da mi ovaj zapis ima fiksnu duzinu od 30 karaktera/mesta sta vec.
Ali on mi u fajl upise jedan unos za drugim bez dodavanja null/empty znakova cak i ako je prvi record manji od 30 ....

Imao sam i ideju da mu sam rucno dodam onoliko puta koliko mu fali do 30 space na kraj stringa ali to je bezveze.

Kako se radi sa ovim ... syswrite ... ovako pise u knjizi a nece ...

AAAAAAaaaaaaaaaaaaaa :)
[ bzero @ 02.02.2004. 22:47 ] @
Ne znam u kojoj si knjizi to procitao, ali tebi uopste ne treba syswrite nego printf():

Code:

printf out ("%30s", $zaupis);

[ Free_Sex @ 03.02.2004. 00:01 ] @
"Perl - detaljni izvornik" ?

Citat:

Funkcija syswrite ima suprotnu ulogu od funkcije sysread. Ona zapisuje blok fiksne velicine skalara u oznaku datoteke :

syswrite filehandle,scalar,length,offset
syswrite filehandle,scalar,length

Ako se navede offset, length bajtova se cita iz argumenta scalar i zapisuje u filehandle. Ako je velicina skalara manja od length, podaci se pune sa null.

open(database,"+<datafile.dat");
..... pronalazenje recorda koji treba da se zameni ....
..... ili ako ga nema pozicioniranje na kraj ....
syswrite(database,$record,80); # Write the record back, repleacing the old version, or adding to the end of file.


A printf kaze da se koristi kad ti treba formatiranje prilikom ispisivanja .... hm ?
[ bzero @ 03.02.2004. 02:57 ] @
Citat:

A printf kaze da se koristi kad ti treba formatiranje prilikom ispisivanja .... hm ?

Koliko sam ja skontao tebi i treba formatirani ispis.

Priznajem da tu knjigu nisam citao, ali isto tako nigde nisam ni procitao da syswrite upisuje length bajtova u filehandle (a pogotovo da upisuje null ili slicno ako nema dovoljno bajtova), nego da ce syswrite pokusati da upise length bajtova, a vraca broj bajtova koji je stvarno upisan (ovo je cak uobicajeno za syswrite, pa se zato kao i sysread obicno stvalja u petlju). Ukoliko ti je skalar dugacak 30 bajtova (ili vise) onda ok, inace nisam siguran. Neka me neko ispravi ako gresim.

Ukoliko ti bas treba syswrite, posto izgleda menjas neki record u nekoj bazi, pa verovatno hoces da pises na odredjenu poziciju, mozes formatiras promenjivu $zaupis pre syswrite, sa sprintf ili pack, u zavisnosti kakav ti format treba:

Code:

$zaupis = sprintf("%30s", $zaupis);
... ili ...
$zaupis = pack "a30", $zaupis;
... ili ...
$zaupis = pack "A30", $zaupis;
syswrite (out, $zaupis, 30);
[ Free_Sex @ 03.02.2004. 23:26 ] @
E ma to sam resio :)

Nista prebrojavm koliko mi karaktera fali do kraja (do 25 karaktera) pa onda dodajem " " tj space. Jer nije mi ni bitno sta tu pise. A bitno mi je da bude na kraju ...

Heh sad sam totalno se pogubio kod pretrazivanja. To se valjda zove binarno ili kako vec. Ono gde stalno bode sredinu pa proverava manje vece i shodno tope pomera pointere za kao pocetak i kraj ....
[ bzero @ 05.02.2004. 23:24 ] @
Citat:

Nista prebrojavm koliko mi karaktera fali do kraja (do 25 karaktera) pa onda dodajem " " tj space.

Nadam se da to ne prebrojavas i dodajes "rucno", upravo tome sluze sprintf i pack.

Citat:
... kod pretrazivanja. To se valjda zove binarno ...


http://www.cpan.org/modules/by...arch/Search-Binary-0.95.readme