[perl] Zoeken in een array

Pagina: 1
Acties:

  • Triple
  • Registratie: Mei 2000
  • Laatst online: 20-05-2025
Dag allen,
Ik ben bezig een adressenverzameling op te zetten en daarvoor gebruik ik een perl script om alle bewerkingen te doen.
De gegevens staan in een bestand (adres.pl) in de vorm naam|achternaam|straat|enz.
Ik kan het bestand in z'n geheel afdrukken op het scherm met een script en nieuw ingevulde adressen uit een HTML form in het bestand schrijven. Nu wil ik nog kunnen zoeken naar een adres, bijv op achternaam.
Zelf zat ik te denken om gebruik te maken van de nummering van de regels in de array, het is al gelukt om 1 regel af te drukken door in een form het regelnummer in te vullen van de regel die moet worden afgedrukt.
Concreet ben ik dus op zoek naar een stukje code dat regel 0 van het array doorzoekt op bijv. Janssen, als Janssen in de regel voorkomt, de regel afdrukken en doorgaan naar regel 1, dit tot het einde van de array. Het afdruk gedeelte heb ik al, nu alleen de zoek opdracht nog.

Alvast bedankt voor de moeite!

There is no beast without cruelty, Friedrich Nietzsche


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

code:
1
2
3
4
$file = 'hetbestand.txt';
open(INFO, $file);
@lines = <INFO>;
close(INFO);

Nu heb je een array met alle regels uit 't bestand.

Doorloop de array met foreach
  • split de regel op /\|/ [list]zet vlaggetje op 0 doorloop de cellen met foreach. [list] Als er een match is, zet vlaggetje op 1[/list]als vlaggetje op 1[list]print regel[/list][/list]

[ Voor 0% gewijzigd door drm op 14-08-2002 14:04 . Reden: domme fout :+ /\|/ ipv /|/ O-) ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Triple
  • Registratie: Mei 2000
  • Laatst online: 20-05-2025
Ok, en heb je misschien een code voorbeeld voor dat deel waar je het vlaggetje set met ook de if then else constructie en de compare of hoe dat heet? Want daar kom ik juist niet uit.

There is no beast without cruelty, Friedrich Nietzsche


  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 18-07 21:03
Hmm ja dat wil ik ook nu wel eens weten :P Moet je niet het "fore search" comando gebruiken?

Een echte golver is nooit uitgeput


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

da's nou juist iets wat je zelf uit moet zoeken :) Anders leer je niets :)

Dit soort dingen zijn wel te vinden in een tutorial (google-ze ;))

Een vlaggetje zetten is niets anders dan een tijdelijke variabele eventjes op 0 of op 1 zetten

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Mini-me
  • Registratie: November 1999
  • Niet online
een vlag zetten kan bijvoorbeeld door een variabele een andere waarde te geven.. simpel toch?
na de loop check je dan gewoon of de variabele is veranderd -> zoja, dan heb je het adres gevonden.
edit:
Grr, drm was me net voor :)

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 01-09 17:48

Koffie

Koffiebierbrouwer

Braaimeneer

Pff .. zelfs _IK_ weet hoe dat moet, en dat zegt al heeeel wat

code:
1
2
3
4
5
6
7
8
9
10
11
open(FE, "$bestand");
@lines = <FE>;
close(FE);
foreach $temp (@lines)
{
        ($vornaam, $achternaam,  $straat, $enz) = split(/\|/,$temp);
        print "Voornaam is $voornaam ":
        print "Achternaam is $achternaam ":
        print "Straat is $straat ":
        print "Enz is $enz ":
}

[ Voor 0% gewijzigd door Koffie op 14-08-2002 14:03 . Reden: klote tags ]

Braaikamer - Smoke&BBQ


  • Triple
  • Registratie: Mei 2000
  • Laatst online: 20-05-2025
Das een beetje het probleem, gisteren de hele dag zitten googelen en nix gevonden wat bruikbaar / begrijpelijk was voor mij. Voor de goede orde, alles wat ik weet staat in http://www.pageresource.com/cgirec/index2.htm Als iemand een uitgebreidere tutorial weet wil ik daar met plezier verder in doorspitten, maar ik kom gewoon niet verder met de kennis die ik nu heb.

There is no beast without cruelty, Friedrich Nietzsche


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Njah sorry hoor, maar dit is toch een beetje basiswerk...

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • Triple
  • Registratie: Mei 2000
  • Laatst online: 20-05-2025
Euh, ja dat weet ik, maar er zijn wel meer dingen basiswerk die toch niet iedereen uit z'n kop kan doen..... kijk maar eens wat ik heb en misschien dat iemend me dan een duwtje in de goede richting kan geven
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#! /perl/usr/perl

# Adressen bestand openen

$data_file="adressen.pl";

open(DAT, $data_file) || die ("Het bestand kan niet worden gevonden!");
@data_array=<DAT>;
close(DAT);

require "cgi-lib.pl";

&ReadParse(*input);

$pos= 0;
$zoek= $input{'zoeknaam'};

# Verschillende info onderbrengen in een eigen variabele en afdrukken op scherm.

print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<TITLE>Adressen bestand</TITLE>\n";
print "<BODY vlink=\"blue\"  bgcolor=darkred text=white>\n";
print "<h4>Met Perl gegenereerd adressen overzicht uit een bestand</h4>\n";
foreach $contact (@data_array[$pos])
{
 chop($contact);
 ($nr,$naam,$tussenv,$anaam,$str,$huisnr,$pc,$plaats,$telnr,$email,$icq)=split(/\|/,$contact);
 if ($zoek==$naam or $zoek==$anaam)
 {
 print "<pre>\n";
 print "----------------------------------------------------\n";
 print "Naam   :  $naam $tussenv $anaam\n";
 print "Adres  :  $str $huisnr<br>          $pc  $plaats\n";
 print "Tel    :  $telnr\n";
 print "E-mail :  $email\n";
 print "ICQ    :  $icq\n";
 print "</pre>\n";
 $pos=++;
 }
 else
 {
 pos=++;
 }
}
print "<a href=\"http://unie.homeip.net:6080/martijn/lia/adres.html\" target=\"_top\">Terug</a>\n";
print "</BODY>\n";
print "</HTML>";

There is no beast without cruelty, Friedrich Nietzsche


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:40
Als je je probleem doelgetricht benadert, kom je met een veel mooier algoritme dan wat Koffie voorstelde. Je wilt immers, van een lijst met strings, de lijst met strings hebben die aan een bepaald patroon voldoen. Het Perl commando grep doet dat precies.

Ik kan me voorstellen dat je dan zoiets maakt:
code:
1
2
@lijst = ('jan jansen', 'piet jansen', 'klaas de boer', 'harrie de boer');
@jansens = grep(/ jansen$/, @lijst);


Voor meer details verwijs ik je naar de perlfunc manpage over grep en perlre over reguliere expressies in Perl.

Het is trouwens een goed idee om je gegevens niet als string op te slaan maar als hash, waardoor je dus een ECHTE datastructuur krijgt:
code:
1
2
3
4
@lijst = (
    ( 'voornaam' => 'Jan', 'achternaam' => 'Jansen'),
    ( 'voornaam' => 'Piet', 'achternaam' => 'Klaassen'),
);


Voor het daadwerkelijke opslaan in een bestand kun je dan wel weer een of andere tekstformaat verzinnen.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:40
Triple schreef op 14 augustus 2002 @ 14:56:
code:
1
 if ($zoek==$naam or $zoek==$anaam)
Het vergelijk van strings werkt zo niet in Perl. Zie man perlfunc onder "functions for strings".

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 01-09 17:48

Koffie

Koffiebierbrouwer

Braaimeneer

Als je je probleem doelgetricht benadert, kom je met een veel mooier algoritme dan wat Koffie voorstelde.
Uiteraard, echter ben ik ook n00b alleen heb ik het gewoon gegoogeld enzo.
Verder was het meer om te laten zien hoe 'ie bij de array kon komen.

* Koffie is er nog steeds van overtuigd dat dit allemaal zonder veel moeite met google te vinden is ...

Braaikamer - Smoke&BBQ


  • Triple
  • Registratie: Mei 2000
  • Laatst online: 20-05-2025
Het zal dan wel, ik zie het niet.... die man pages maar eens bekijken.

Bedankt voor de hulp!

There is no beast without cruelty, Friedrich Nietzsche


  • Triple
  • Registratie: Mei 2000
  • Laatst online: 20-05-2025
Zucht.... ik kom nog altijd niet verder.... in het volgende script zou ik verwachten dat er wordt gecontroleerd of de achternaam van de gegevens van de eerste regel van het bestand overeenkomt met de zoeknaam, zo ja, adres afdrukken, zo nee melding geven dat nix gevonden is. In de praktijk wordt het eerste adres gewoon afgedrukt, ongeacht of de if statement klopt of niet.


Hints graag in uitgeklopte code anders snap ik er nog nix van merk ik.....

There is no beast without cruelty, Friedrich Nietzsche


  • Triple
  • Registratie: Mei 2000
  • Laatst online: 20-05-2025
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#! /perl/usr/perl

# Adressen bestand openen

$data_file="adressen.pl";

open(DAT, $data_file) || die ("Het bestand kan niet worden gevonden!");
@data_array=<DAT>;
close(DAT);

require "cgi-lib.pl";

&ReadParse(*input);

$pos= 0;
$zoek= $input{'zoeknaam'};



# Verschillende info onderbrengen in een eigen variabele en afdrukken op scherm.
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<TITLE>Adressen bestand</TITLE>\n";
print "<BODY vlink=\"blue\"  bgcolor=darkred text=white>\n";
print "<h4>Met Perl gegenereerd adressen overzicht uit een bestand</h4>\n";
foreach $contact (@data_array[$pos])
{
 chop($contact);
 ($nr,$naam,$tussenv,$anaam,$str,$huisnr,$pc,$plaats,$telnr,$email,$icq)=split(/\|/,$contact);
 if ($zoek==$anaam)
 {
 print "<pre>\n";
 print "----------------------------------------------------\n";
 print "Naam   :  $naam $tussenv $anaam\n";
 print "Adres  :  $str $huisnr<br>          $pc  $plaats\n";
 print "Tel    :  $telnr\n";
 print "E-mail :  $email\n";
 print "ICQ    :  $icq\n";
 print "</pre>\n";
 }
 else
 {
 print "Geen naam gevonden\n";
 }
}
print "<a href=\"http://unie.homeip.net:6080/martijn/lia/adres.html\" target=\"_top\">Terug</a>\n";
print "</BODY>\n";
print "</HTML>";

There is no beast without cruelty, Friedrich Nietzsche


Verwijderd

Triple schreef op 14 augustus 2002 @ 16:21:
Hints graag in uitgeklopte code anders snap ik er nog nix van merk ik.....
Da's niet de bedoeling natuurlijk. Om te leren zou je aan hints genoeg moeten hebben. Is dat niet het geval, dan is hetgene je probeert misschien te hoog gegrepen op het ogenblik voor jou, en kun je je beter met de basics bezighouden voordat je dit probeert.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:40
Soultaker schreef op 14 augustus 2002 @ 15:02:
[...]
Het vergelijk van strings werkt zo niet in Perl. Zie man perlfunc onder "functions for strings".
Ik zeg dat niet voor niets, he! Ga nou eerst maar eens met de gedane suggesties aan de slag, voordat je hier weer een hele lap code komt posten met de melding "zie maar dat je 't fixt".

  • Triple
  • Registratie: Mei 2000
  • Laatst online: 20-05-2025
Nou, ik heb het voor elkaar hoor.... het enige dat ik fout had gedaan was dus dat ik == had gebruikt om strings te vergelijken en niet eq.....
Ik hoop dat iemand er ooit nog eens iets aan heeft.
Ik heb er een boek voor moeten kopen om er achter te komen aangezien ik geen flauw idee heb waar ik perl manpages kan vinden....
Een directe tip had me 50 euro kunnen schelen, maar ja, dat boeit natuurlijk niemand.

Edit: zpelvaud

There is no beast without cruelty, Friedrich Nietzsche


  • weballey
  • Registratie: Juli 1999
  • Laatst online: 23-07 13:36
Je had ook op http://www.perldoc.com/ kunnen kijken.
http://www.perldoc.com/pe...p.html#Equality-Operators

Verder is het volledig inlezen in een array niet echt efficient. Je kunt het printen en inlezen combineren, waardoor er (veel) minder geheugen gebruikt wordt, en het script sneller loopt.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:40
Triple schreef op 22 augustus 2002 @ 17:17:
Ik hoop dat iemand er ooit nog eens iets aan heeft.
Ik heb er een boek voor moeten kopen om er achter te komen aangezien ik geen flauw idee heb waar ik perl manpages kan vinden....
Q: Waar kan ik "X" vinden?
A: Probeer "X" in te typen in Google.

En wat is de eerste hit als je in Google "perl manpages" intypt? Als je trouwens ook maar enigszins bekend bent met het man-systeem, dan had je ook gewoon "man perl" in kunnen typen. Wist je dat niet, dan is dat nog steeds je eigen stomme schuld; dan had je maar uit moeten zoeken wat man is.
Een directe tip had me 50 euro kunnen schelen, maar ja, dat boeit natuurlijk niemand.
Tja, als je dat boek het geld niet waard vind, had je het niet moeten kopen. Zelf ben ik meestal erg gelukkig als ik een boek kan kopen, waaruit ik nieuwe boeiende dingen kan leren. Ik zou omwille van die ervaring maar wat graag met je hebben geruild!

Als je echter allleen een ad-hoc oplossing zocht, had je inderdaad beter 20 euro op mijn rekening kunnen storten, dan had ik er een uurtje voor uit getrokken. Je kunt niet redelijkerwijs verwachten dat ik (of wie dan ook hier) ten koste van zijn eigen vrije tijd jou gratis support gaat leveren op een vaag scriptje van derden.

Ik heb je trouwens uitgebreid gewezen op het feit dat string comparison met == niet werkt. Dat je mijn aanwijzingen negeert is je eigen beslissing, maar zeg niet dat ik niet geprobeerd heb je te helpen.

  • WAcKiN
  • Registratie: November 1999
  • Laatst online: 28-08-2023
Hey soul, kan je ook een uurtje voor ons uittrekken? :]

(check je voicemail)
Pagina: 1