Perl kookboek (voorbeeldprogramma's, onderverdeeld in categorieën)
- Introductie
- Verwerken van bestanden
- Verwerken van mappen
- Subroutines en parameters
- Operaties op .HTM of .HTML bestanden (webpagina's)
- Links
Introductie
Alle onderstaande scripts zijn getest onder Windows 7.
Verwerken van bestanden
De volgende onderwerpen:
- Open van bestand dat als parameter is meegegeven
- Actie uitvoeren op alle of geselecteerde regels van een bestand
Open van bestand dat als parameter is meegegeven
Je wilt in het programma een bestand openen (voor input), en dat als parameter aan het programma meegeven. Verder wil je een duidelijke foutmelding als het misgaat.
Dat kan met de volgende simpele code:
use English;
open INVOER, "<$ARGV[0]" or die "File name not correct ($OS_ERROR)!";
Het '<'-teken na de eerste quote is niet nodig, omdat een bestand standaard voor input wordt geopend.
$ARGV
is de array met parameters van het programma,
al is er natuurlijk geen garantie dat de gebruikers parameters heeft
ingetikt.
Als je het netjes wil doen moet je daar op testen.
Omdat je als 1e regel use English
hebt gedaan
kan je in de 2e regel refereren aan $OS_ERROR
.
Anders had je $!
moeten gebruiken.
Actie uitvoeren op alle of geselecteerde regels van een bestand
Veronderstel dat je een bestand hebt geopend met als handle
INVOER
Om iets te doen met elke regel tot je bij het eind van het bestand bent gebruik je deze structuur:
while (<INVOER>) {
doe iets met regel;
}
Als je alleen iets wilt doen met regels die aan een bepaald patroon voldoen
gebruik je de volgende structuur binnen de while
-lus:
if (/patroon/) {
doe iets met regel;
}
Of, als je bv. informatie van bepaalde regels wilt afdrukken:
print wat je wilt afdrukken if (/patroon/);
Verwerken van mappen
In dit voorbeeld wordt een folder met de naam COMP benaderd. Met alle files WP in de map, waarvan de naam voldoet aan een patroon, wordt iets gedaan:
opendir(COMP,$dir) or die "Can't open folder $dir: $!\n";
while (defined($file = readdir(COMP))) {
if ($file =~ /pattern/) {
open WP, "$dir\\$file" or die "Can't open file $dir\\$file: $!";
...
do things with the file
...
close WP;
}
Subroutines en parameters
De volgende onderwerpen:
Testen of een programma parameters heeft
De parameters van een programma
belanden in een array met de naam ARGV
.
Je kan er aan refereren met de namen ARGV[0], ARGV[1]
,
etc.
Maar je weet natuurlijk niet zeker of er ook werkelijk parameters zijn ingetikt.
Om daar achter te komen kan je gebruik maken van de hoogste in gebruik zijnde
index in de array, de variabele $#ARGV
.
Dus als je 1 parameter verwacht (een bestandsnaam) kan je dat controleren, en als het er minder of meer zijn bv. een melding afdrukken over hoe het programma gebruikt moet worden. Dat doe je als volgt:
$nrpars = $#ARGV+1;
if ($nrpars != 1) {
print "\nUsage: Title.pl bestandsnaam\n"
}
else
{...}
Operaties op .HTM of .HTML bestanden (webpagina's)
De volgende onderwerpen:
- Wat staat er tussen de <title> tags op een webpagina?
- Wat staat er in de meta-tag description?
- 2 rijen toevoegen aan het eind van een tabel
Wat staat er tussen de <title> tags op een webpagina?
Om het zo simpel mogelijk te houden lees ik het hele bestand als 1 lange regel in (4e en 5e regel).
In de 6e regel zoek ik vanaf de genoemde tag tot het eerstvolgende <-teken. Alles wat daartussen staat is het stuk tussen ronde haakjes, en krijgt daarna de variable naam '$1' (omdat het de 1e set ronde haakjes is).
De betekenis van het stuk tussen vierkante haken is alles wat niet < is. De betekenis van het stuk tussen ronde haken is minimaal 1 keer het stuk tussen vierkante haken.
Tenslotte druk ik de tekst af.
use English;
open WP, 'g:\website\computer\computer.htm';
open HFO, '>d:\test\op.txt';
undef $/; # Output record separator
$_=<WP>; # Put entire file in 1 variable
if (/<title>([^<]+)</is) # Everything between <title> and <, min. 1 char.
# Case insensitive (i), consider EOL whitespace
{
print HFO "\n$1";
}
print HFO "\n";
close HFO;
close WP;
Wat staat er in de meta-tag description?
Een meta-tag ziet er doorgaans als volgt uit:
<meta name="..." content="..." />,
bv.
<meta name="author" content="Jan Jansen" />
Er kunnen meerdere meta-tags zijn, dus je moet eerst uitvissen of het om de description-tag gaat, en vervolgens de inhoud van het content-veld zoeken.
In de 1e regel wordt de complete webpagina ingelezen met file handle
WP
.
$_=<WP>;
if (/<meta([^"]+)"description"([^"]+)"([^"]*)"/is)
# $1 is text between meta and "description"
# $2 is text between "description" and next " (of content=")
# $3 is text between first and last quote after content
{
print "\nDescription:\n";
print "\n$3\n";
}
2 rijen toevoegen aan het eind van een tabel
De laatste tag van een rij in een tabel is </tr>
En als je 2 rijen wilt toevoegen moeten er 2 regels voor die tags komen,
nl. 2 keer <td></td>
, met nog een newline
aan het eind.
Dat kan met het volgende simpele programmaatje:
use English;
open WP, 'f:\website\computer\action-index.htm';
open HFO, '>f:\website\computer\test.htm';
undef $/;
while (<WP>)
{
s/<\/tr>/<\/td>\n <\/td>\n<\/tr>/g;
print HFO;
}
close HFO;
close WP;
In dit geval staat het zoekargument op 1 regel, dus lees ik regels in, i.p.v.
de hele file in 1 keer.
Maar op die manier kan het natuurlijk ook.
Dit voorbeeld gaat er wel van uit dat er maar 1 tabel op de webpagina staat,
of dat je 2 rijen aan elke tabel op de pagina wilt toevoegen.
(Als er meerdere tabellen op de pagina staan waarvan je maar 1 wilt wijzigen,
zou je evt. dat stuk even in een apart bestand kunnen zetten, en na wijziging
weer terugplakken in het oorspronkelijke bestand.)
Links
-
-
-
-
-
-
-
-
Tweeten
© Henk Dalmolen
Reageer via E-mail (dalmolen@xs4all.nl)
Deze pagina is voor het laatst gewijzigd op:
04-02-23 15:37:24