Perl Programmering 2

Grundstruktur for Perl program der læser input fra en fil og som genererer og skriver output til en ny fil.

Kør programmet fra kommandolinien:

C:\strawberry\perl perl demoprogram.pl in.txt out.txt

# Programnavn eller note om brug
use strict;
use warnings;

    my $file = $ARGV[0];
    open(INPUT, $file) or die("Input file $file not found.\n");
    my $output = $ARGV[1];
    open(OUTPUT, '>'.$output) or die "Can't create $output.\n";

while(my $line = <INPUT>) {
        $line =~ s|you|WE|ig;        #erstat you med WE overalt i input-fil
        $line =~ s|abc|ABC|ig;       #erstat abc med ABC overalt i input-fil
print OUTPUT $line;
            }
close(INPUT);close(OUTPUT);

Brug temporær fil ved mere komplicerede find/replace

# Programnavn eller note om brug
use strict;
use warnings;

    my $file = $ARGV[0];
    open(INPUT, $file) or die("Input file $file not found.\n");
    my $output = $ARGV[1];
    open(OUTPUT, '>'.$output) or die "Can't create $output.\n";

    open TEMP, "+>temp2.txt" or die $!; 

    while(my $line = <INPUT>) {
      $line =~ s|<span style="color: blue">(.*?)</span>|$1|ig;
      $line =~ s|<span style="color: green">(.*?)<span style="color: red">(.*?)</span>"</span>|$1$2 %%|ig;
    print TEMP $line;  }

    close(TEMP);     

    open(TEMP2, "<temp2.txt") or die "Can't create $output.\n";

    while(my $line2 = <TEMP2>) {
     $line2 =~ s|<span>&lt;(.*?)&gt;</span>|<$1>|ig;
     $line2 =~ s|&lt;|<|ig;
     $line2 =~ s|&gt;|>|ig;

    print OUTPUT $line2;  }

close(TEMP2);
close(INPUT); close(OUTPUT);

Alm. problemer

  1. Husk altid at escape (med \) punktum, spørgsmålstegn og runde parenteser i den søgte streng - ellers er der ingen match
  2. Gem altid .pl-filen i UTF-8-format
  3. Regex på tværs af linieskift: fjern først alle linieskift før match mønster udvælges:
$line =~ s|\n| |g;  #erstat alle linieskift med space

Grundstruktur for Perl program til høst af websiders kildekode

Hvis man høster portioner, f.eks 500 poster ad gangen, er det nødvendigt at sammenholde antal hjemtagne poster med det forventede i forhold til svarsættets indhold, hvis der er færre, skyldes det som regel, at en eller flere "linier" faktisk ikke indeholder kravet om levering af 500 poster, syntaksfejl medfører, at databasen kun leverer default værdien, f.eks. 20 poster.
For sites som Google Scholar er det nødvendigt at indlægge en tidsforsinkelse mellem de enkelte forespørgsler, f.eks: sleep 20

Medmindre andet er angivet, er indholdet af denne side licenseret under Creative Commons Attribution-ShareAlike 3.0 License