Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem :(

[es] :: Perl :: Problem :(

[ Pregleda: 4526 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Sole_boy

Član broj: 2486
Poruke: 58
*.ptt.yu



Profil

icon Problem :(21.02.2003. u 21:25 - pre 256 meseci
Postovanje,

imam jedan problem, radim neki programcic i treba mi CODE za pretragu u nekom txt fajlu na sledeci nacin:

recimo da imam u bazi par reci tipa:

sima|djoka
rasa|pera
rasko|perica

e sada npr. user unese ra kao input, kako recimo da on ispise vrednosti za rasa i za rasko, znaci treba da ispise za rasa pera a za rasko perica, takodje da ako unese rasa samo za rasa da ispise onda?

Nadam se da sam bio jasan!

Mnogo Vam hvala!
 
Odgovor na temu

Dragoslav Krunić

Član broj: 225
Poruke: 1083
*.verat.net



Profil

icon Re: Problem :(21.02.2003. u 23:15 - pre 256 meseci
Code:

#! /usr/bin/perl

open(FAJL,"parovi.dat");
@parovi=<FAJL>;
chomp(@parovi);
close(FAJL);

$query = <STDIN>;
chomp($query);

foreach(@parovi){
@arr=split(/\|/, $_);
print $arr[1]."\n" if($arr[0] =~ s/$query/gs);
}
 
Odgovor na temu

MrYoo

Član broj: 30
Poruke: 198
*.bitsyu.net

ICQ: 47188818


Profil

icon Re: Problem :(22.02.2003. u 01:31 - pre 256 meseci
Ja ne volim da prepravljam tudji rad ali ima par gescica siguran sam da ih je kolega Kruinic napravio slucajno.

Dacu dva primera koda jedan skolski a drugi za one koje mrzi da kucaju.

Ali prvo da vidimo sta ne valja u prethodnom kodu.

Code:


#!/usr/bin/perl

open(FAJL,"<parovi.dat"); 

# Ako vec pisemo u obrazovne svrhe treba staviti znak manje "<" iako se to 
# podrazumeva 
 
@parovi=<FAJL>;
chomp(@parovi);      # Nema potrebe ovo raditi na kompletnom nizu 

close(FAJL);

$query = <STDIN>;
chomp($query);

foreach(@parovi){

@arr=split(/\|/, $_);
print $arr[1]."\n" if($arr[0] =~ s/$query/gs);  
# Ne treba "s" jer se radi provera sadrzaja a ne substitucija

}



Skolski primer :

Code:


#!/usr/bin/perl

open (LOG, "<parovi.dat") or die "Ne mogu da otvorim fail, $!";
@parovi=<LOG>;
close(LOG);

$query =<STDIN>;   
chomp $query;

foreach (@parovi) {
    
    @arr = split /\|/, $_;                                  # K1
    print $arr[1]."\n" if $arr[0] =~ /$query/gs ;

}



Komentar skolskog primera :

- Svi znamo sta znaci prva linija
- Otvaranje file-a parovi.dat radi citanja sadrzaja ako je otvaranje neuspesno ispisuje se poruka o gresci. $! sadrzi poruku sta tacno nije u redu
- #K1 Ova linija moze da se napise i bez promenljive $_ jer se ona podrazumeva

Primer za one koje mrzi da kucaju

Code:


#!/usr/bin/perl

open LOG, "<parovi.dat" or die "Ne mogu da otvorim file, $!";
@parovi=<LOG>;
close LOG;
 
chomp ($query =<STDIN>);

for (@parovi) {
    @arr = split /\|/;
    print $arr[1]."\n" if $arr[0] =~ /$query/gs ;
}



Trebao si da koristis zenska imena u parovi.dat lakse bi radili :o)
 
Odgovor na temu

Dragoslav Krunić

Član broj: 225
Poruke: 1083
*.verat.net



Profil

icon Re: Problem :(22.02.2003. u 11:03 - pre 256 meseci
Da, hvala na ispravkama. Onu grešku kod provere sadržaja sam u brzini napravio, pošto sam tokom proteklih dana radio isuviše substitucija (takva je bila priroda projekta) pa sam valjda malo odlepio Zamolio bih ljude da ubuduće, ako mogu, daju i školski primer i što kraći primer (što bi MrYoo rekao - za lenje da bi ljudi videli da i tako može. Objašnjenje je poželjno, ma da ni sam ne znam zašto ga nisam napisao.

Takođe ne znam ni što mi je chomp na celom nizu bio potreban. Ako već nećemo chomp, onda ono "\n" kod štampanja rezultata treba izbaciti.
 
Odgovor na temu

bzero
dev null
europe

Član broj: 5907
Poruke: 371
195.228.188.*

Jabber: bzero@elitesecurity.org
Sajt: www.google.com/search?q=b..


Profil

icon Re: Problem :(22.02.2003. u 11:31 - pre 256 meseci
Posto je vec dat i skolski i duzi primer, sa objasnjenjem, evo i jednog kraceg resenja:

Code:

#!/usr/bin/perl -w

chomp($input = <>);

open FILE, "<parovi.dat" or die $!;
while(<FILE>){
    (/^$input/) && s/^.+\|// && print;
}
close FILE;

Never trust an operating system you don't have sources for.
 
Odgovor na temu

MrYoo

Član broj: 30
Poruke: 198
*.bitsyu.net

ICQ: 47188818


Profil

icon Re: Problem :(22.02.2003. u 12:28 - pre 256 meseci
Mislim da ce malo ko razumeti ovaj kod zato je bolje da ga malo iskomentarisemo i pojasnimo dakle :

Code:


#!/usr/bin/perl -w      #1

chomp($input = <>);     #2

open FILE, "<parovi.dat" or die $!;     #3

while (<FILE>) {     #4

(/^$input/) && s/^.+\|// && print;     #5

}

close FILE;     #6



Objasnjenje :

#1 Prva inija je standardna samo sto koristi jos i -w sto ukljucuje upozorenja tj warnings. Da ne bi ulazio u objanjenja sta -w tacno znaci, ali u najkracim crtama kompajler izbacuje upozorenja ukoliko nesto nije u redu sa kodom

#2 Ova linija cita sta korisnik upisuje i odma odseca "new line" naredbom "chomp" a to sve smesta u promenljivu $input . Izostavljeno je STDIN izmedju <> jer se ono podrazumeva ako se nista ne navede

#3 Ovo je objasnjeno u prethodnoj poruci, ali da ponovimo otvaramo parovi.dat radi citanja sadrzaja u koliko nesto nije u redu ispisuje se poruka o gresci sa promenjivom $! koja sadrzi istu

#4 Petlja while(<FILE>) cita sadrzaj file-a red po red i smesta ga u promenljivu $_ (Perl favorite default, kako neki vole da je zovu)

#5 E sada najteza linija u celom kodu koja u stvari i nije toliko teska. Ali hajde da krenemo redom oerator && je u stvari AND, a kada se on iskoristi u ovakvom smislu predstavlja malo cudan nacin pisanja uslova if.

u liniji

Code:


(/^$input/) && s/^.+\|// && print;



imamo tri uslova

1) (/^$input/)
- Proverava se da li korisnicki unos odgovara pocetku stringa koji je procitan iz file-a. ^ Znaci da proveravamo pocetag stringa e sada neki ce se pitati kog stringa pa naravno onog koji je u promenljivoj $_ koja se naravno ne pise jer se podrazumeva

2) s/^.+\|//
- Brise karaktere do ravne linije i ravnu liniju, a rezultat toga se smesta u promenljivu $_, ako je promena uspesna vraca se vrednost 1. sto je jako bitno zbog operatora and (&&), u protivnom ne bi bilo ispisa

3) print
- Ispis onoga sto se nalazi u promenljivoj $_

#6 Samo zatvaramo file koji smo otvorili naravno moze i bez ovoga jer bi perl zatvorio file posle zavrsetka programa ali nije lose da budemo precizni.

Nadam se da samo malo pomoga i da je komentar potpun, koncizan i sa svim potrebnim objasnjenjima.


Jedna malo preporuka ovo je izuzetno kratko zapisivanje koda sto dokazuje da autor vlada materijom ali ujedno ovaj kod je prakticno WRITE ONLY jer je dosta tezak za onoga ko nije toliko vest u perl-u. Zato pisite vas kod citljivije jer ce i vama biti lakse da vidite sta ste hteli ako nekad budete radili reviziju vaseg koda.

:o)

 
Odgovor na temu

Dragoslav Krunić

Član broj: 225
Poruke: 1083
*.verat.net



Profil

icon Re: Problem :(22.02.2003. u 12:33 - pre 256 meseci
MrYoo, svaka čast. Samo napred, ljudi, sa ovakvim postovima.
 
Odgovor na temu

Sole_boy

Član broj: 2486
Poruke: 58
*.ptt.yu



Profil

icon Re: Problem :(22.02.2003. u 14:01 - pre 256 meseci
Hvala Vam ljudi,

i imam jos nesto, kako recimo ako imam rec: TEST da prvo slovo prebaci u veliko tj. da ostane veliko a ostala mala!
 
Odgovor na temu

MoDcHe
SER Sabac

Član broj: 4
Poruke: 486
*.ptt.yu

Jabber: modche@elitesecurity.org
ICQ: 73295306
Sajt: localhost


+3 Profil

icon Re: Problem :(22.02.2003. u 14:08 - pre 256 meseci
Hvala Bogu da i PERL zazivi malo, btw. Pozdrav MrYOO nisam te dugo video.
When you say "I wrote a program
that crashed Windows", people
just stare at
you blankly and say "Hey, I got
those with the system, *for
free*".
-- Linus Torvalds
 
Odgovor na temu

bzero
dev null
europe

Član broj: 5907
Poruke: 371
195.228.188.*

Jabber: bzero@elitesecurity.org
Sajt: www.google.com/search?q=b..


Profil

icon Re: Problem :(22.02.2003. u 14:09 - pre 256 meseci
Citat:
MrYoo:

Nadam se da samo malo pomoga i da je komentar potpun, koncizan i sa svim potrebnim objasnjenjima.


Komentar je odlican i vrlo koristan, svaka cast. Ovaj kod je inace bio samo primer da je moguce i ovako pisati Perl programe, naravno drugo je pitanje kada je tako nesto potrebno i ima smisla.
Never trust an operating system you don't have sources for.
 
Odgovor na temu

bzero
dev null
europe

Član broj: 5907
Poruke: 371
195.228.188.*

Jabber: bzero@elitesecurity.org
Sajt: www.google.com/search?q=b..


Profil

icon Re: Problem :(22.02.2003. u 20:30 - pre 256 meseci
Citat:
Sole_boy:
i imam jos nesto, kako recimo ako imam rec: TEST da prvo slovo prebaci u veliko tj. da ostane veliko a ostala mala!


Moze ovako, sa substr nadjes prvo slovo, pa ga prebacis u veliko sa tr, a onda na isti nacin sva ostala u mala slova:

Code:

#!/usr/bin/perl -w

$word = "TEST";

substr($word, 0, 1) =~ tr/a-z/A-Z/;
substr($word, 1) =~ tr/A-Z/a-z/;

print $word;


Naravno ne bi Perl bio ono sto jeste, da ne moze sve da se uradi i u jednoj liniji, ovaj put koriscenjem escape karaktera:

Code:

#!/usr/bin/perl -w

$word = "TEST";

print "\u\L$word";

Never trust an operating system you don't have sources for.
 
Odgovor na temu

MrYoo

Član broj: 30
Poruke: 198
*.bitsyu.net

ICQ: 47188818


Profil

icon Re: Problem :(22.02.2003. u 23:12 - pre 256 meseci
Citat:
Sole_boy:
Hvala Vam ljudi,

i imam jos nesto, kako recimo ako imam rec: TEST da prvo slovo prebaci u veliko tj. da ostane veliko a ostala mala!


Trebao bi da procitas malo RX i manipulaciju sa stringovima jer je perl tu jedan od najacih programskih jezika. Ovako mnogo propustas jeste tesko nauiti sta svaka komanda znaci ima ih stvarno dosta ali bez muke nema nauke.

Hvala na pohvalama trudicu se da nastavim tako, pozdrav za modica.

:o)

 
Odgovor na temu

Dragoslav Krunić

Član broj: 225
Poruke: 1083
*.verat.net



Profil

icon Re: Problem :(22.02.2003. u 23:22 - pre 256 meseci
Takođe, pogledaj man perlre. A možda se nađe i nešto interesantno u TOP temi u ovom forumu. Ukoliko imate neke linkove sa interesantnim sadržajem, recite pa ću dodati u TOP temu.
 
Odgovor na temu

MoDcHe
SER Sabac

Član broj: 4
Poruke: 486
*.ptt.yu

Jabber: modche@elitesecurity.org
ICQ: 73295306
Sajt: localhost


+3 Profil

icon Re: Problem :(23.02.2003. u 14:33 - pre 256 meseci
Mozes da probas i ovako:

$var = "TEST";

lc($test);
ucfirst($test);

Pozdrav!
When you say "I wrote a program
that crashed Windows", people
just stare at
you blankly and say "Hey, I got
those with the system, *for
free*".
-- Linus Torvalds
 
Odgovor na temu

[es] :: Perl :: Problem :(

[ Pregleda: 4526 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.