[Wiki Startseite]TechDoc/PerlTricks

Ask23: Ask23Wiki > TechDoc > PerlTricks || NeuesteAenderungen | Einstellungen

nützliche perl-codeschnipsel und methoden

1. basics
1.1. einzeiler
1.2. einfache benchmark
2. lesen & schreiben von dateien
2.1. file lock
2.2. verzeichnisliste einlesen
3. CGIpm
3.1. dump
3.2. selbstaufruf eines skripts nebst parametern
3.3. url der html-seite, in die ein skript eingebettet ist
3.4. fileupload fehler
4. LibXML
4.1. beispiel
4.2. textContent
4.3. textContent 2
4.4. libxml mit xpath
5. alphabetisch sortieren
5.1. schwartzian transform + umlaute
6. komplexe hashstrukturen
6.1. hash dumpen
6.2. hash nach value sortieren
6.3. hash nach mehreren values sortieren
6.4. komplexer hash over hash + array
6.5. etc

siehe auch


1. basics


1.1. einzeiler

lokale pfade zu perl-bibliotheken

 perl -e 'print map "$_\n", @INC'

moduldokumentation in html umwandeln

 pod2html --infile=/usr/share/perl5/XML/Writer?.pm --outfile=Writer.html

CPAN shell (zum laden und aktualisieren von perl modulen aus dem CPAN)

 perl -MCPAN -e shell

ptkdb, ein grafischer perl-tk-debugger

 perl -d:ptkdb scriptname.pl


1.2. einfache benchmark

 my $anfang = (times)[0];  # benchmark
 (...)
 my $ende = (times)[0];  # benchmark
 printf "%.2f sec.\n", $ende - $anfang;


2. lesen & schreiben von dateien


2.1. file lock

z.b. für ein logfile

 use Fcntl ':flock';

 open (ERRORLOG, ">>$error_log") || die "error_log kann nicht zum lesen geöffnet werden";
 flock(ERRORLOG, LOCK_EX);
 print ERRORLOG "[$date] $error $file\n";
 flock(ERRORLOG, LOCK_UN);
 close ERRORLOG; 


2.2. verzeichnisliste einlesen

nur dateien mit einer bestimmten dateiendung (hier *.ext)

 my @ext_files = grep /ext$/, readdir(DIR);

nur unterverzeichnisse, aber nicht "." und ".."

  opendir(DIR, $dir)
  my @subdirs =  grep { !/^\.\.?$/ && -d "$dir/$_" } readdir DIR;
  close DIR;


3. CGIpm

siehe cgi.pm


3.1. dump

"The Dump() method produces a string consisting of all the query's name/value pairs formatted nicely as a nested list"

 print $query->Dump


3.2. selbstaufruf eines skripts nebst parametern

aus TechDoc/AskDub1?

 use CGI;
 my $cgi = new CGI;
 $add_url = $cgi->url(-query => 1);     # vollst. URL plus parameter
 $add_url = $add_url."?" unless ( $add_url =~ /\?/g );   # (opt.) ? anfügen, für den 1. aufruf ohne parameter
 (...)
 $add_url = $add_url."&param=value";    # neuer parameter anfügen

nützlich zum erneuen aufrufen des skripts, z.b. für eine funktion "formular felder hinzufügen" (to do)


3.3. url der html-seite, in die ein skript eingebettet ist

siehe TechDoc/TicketLoginPl?

 print $q->url(-path => 1);    # gibt den string "included://localhost/draft/eingabe/" aus


3.4. fileupload fehler

die fileupload-funktion von cgi.pm ist im prinzip sehr komfortabel, allerdings auch sehr sensibel und fehleranfällig (wie auch immer mal wieder in einigen webforen nachzulesen ;)

beispiel: der aufruf eines perl-moduls, welches ebenso wie das script auf cgi.pm zugreift (auch wenn mit einem anderen konstruktor), bewirkt auf ersten blick keinen fehler, alle formular-parameter werden korrekt übergeben, nur der filehandle $fh = $q->upload('uploaded_file') ist leer.

workaround: da im modul nur die cookie-funktionen genutzt werden, relativ einfach, eine neue initialisierung (mit my $q = new CGI)entfällt.

modul bisher

 use CGI;
 my $qq =  new CGI;
 $value = $qq->cookie("name");

modul jetzt

 use CGI::Cookie;
 my %cookies = fetch CGI::Cookie;
 $value = $cookies{name}{value}[0];


4. LibXML?

XML::LibXML (local: /usr/lib/perl5/XML/LibXML?)


4.1. beispiel

aus /Ask23Collect

 my $parser = XML::LibXML?->new();
 my $tree = $parser->parse_file($xml_file);
 my $root = $tree->getDocumentElement?;
 my $owner = $root->findvalue('owner/@name');
 my $info = $root->findvalue('info');
 foreach my $node ($root->findnodes('ressource')) {
    my $ressource = $node->getAttribute('url');
    push ( @ressourcen, $ressource );
 }


4.2. textContent

 $node->textContent

"this function returns the content of all text nodes in the descendants of the given node as specified in DOM."

xml

 <element id="4" name="contributors" repeat="yes" type="optional" access="all">
		<form tag="select" name="contributor_qualifier" iterations="3" accesskey="4b">
			<option value="">option_description</option>
		</form>
 </element>         

perl

 foreach my $subnode ($node->findnodes('option')) {
    my $option_description = $subnode->textContent('option');
 }


4.3. textContent 2

$node->textContent funktioniert nicht mit XML::LibXML?, version 1.31 (installiert unter debian woody mit perl 5.6.1. einführung von textContent ab v1.5, 20. mai 2002)

 my $content = $node->textContent('content');

workaround:

 my $content = $node->getFirstChild?->getData;  


4.4. libxml mit xpath

siehe http://www.linux-magazin.de/Artikel/ausgabe/2005/08/perl/perl.html

xml:

 <index>
  <schlagwort name="Unbewusste, das">
    <ressource url="/draft/archiv/md47_zeitschriften/riss.html.dat" />
  </schlagwort>
 (....)

libxml mit xpath:

 my $parser = XML::LibXML?->new();
 my $tree = $parser->parse_file($xml_file);
 my $query = "Unbewusste, das";
 for my $ressource($tree->findnodes('/index/schlagwort[@name="'.$query.'"]/ressource/@url'))    {
     push ( @treffer, $ressource );
 }


5. alphabetisch sortieren

vgl. beispiele in http://userpage.fu-berlin.de/~corff/perl/perlkurs-6.html


5.1. schwartzian transform + umlaute

vgl. http://mail.pm.org/pipermail/vienna-pm/2000-September/000695.html

      @a = map { $_->[0] } 
	     sort { $a->[1] cmp $b->[1] } 
		  map { [$_,
			 do { my $x = $_;
			      $x =~ tr/äöü/aou/;
			      $x =~ s/ß/ss/;
			      $x;
			    }
			]
		      } 
		      @a;     


6. komplexe hashstrukturen

vgl. "programmieren mit perl: Hashes of Hashes" S.290ff 1 oder Perl Hash Howto


6.1. hash dumpen

HoH? %element

 use Data::Dumper;
 $Data::Dumper::Purity = 1;
 open (FILE, "> element.data") or die "can't open element.data: $!";
 print FILE Data::Dumper->Dump([\%element], ['*element']);
 close FILE;


6.2. hash nach value sortieren

see also: 2

HoH? %element mit $element{name}{id}

 	# get hash of all id's
	my %id;
	for my $name ( keys %element ) {
		$id{$name} = ${element}{$name}{id};
	}

	# sort elements by id	
	for my $name ( sort { $id{$a} <=> $id{$b} } keys %element ) {
                 (...)
        }

oder http://www.devdaily.com/perl/edu/qanda/plqa00016/

Hash %element mit $element{name}

        # sort all values,

	sub hashValueDescendingNum? {    # sort by value of the hash, descending
	   $related_keywords{$b} <=> $related_keywords{$a};
	}
	foreach my $keyword (sort hashValueDescendingNum? (keys(%related_keywords))) {
	   print "$keyword  => related_keywords{$keyword}\n";
	}


6.3. hash nach mehreren values sortieren

siehe 3

e.g. sort by date_last_modified and then by title

  my %hoh = %{$collection->{collections}};
  foreach my $key (sort {"\L$hoh{$a}{date_last_modified}" cmp "\L$hoh{$b}{date_last_modified}" or
                         "\L$hoh{$a}{title}" cmp "\L$hoh{$b}{title}"
                    } 
                   keys %hoh) {
    print $hoh{$key}{title}." - ".$hoh{$key}{date_last_modified};
  }


6.4. komplexer hash over hash + array

HoH? %index mit $index{status}{schlagwort}[url1, url2, ...]

wert hinzufügen

          push @{ $index{$status}{$schlagwort} }, $ressource;

ausgabe

         for my $status ( keys %index ) {
		print "status: $status\n";
		for my $schlagwort ( keys %{ $index{$status} } ) {
			print "\t$schlagwort:\n";
			for my $i ( 0 .. $#{ $index{$status}{$schlagwort} } )  {
				print "\t\t$index{$status}{$schlagwort}[$i]\n";
			}	
		}
          }

oder auch

                         for my $ressource( @{$index{$status}{$schlagwort}} )  {
				print "\t\t$ressource\n";
	                 }	


6.5. etc

HoA? %element mit $element{name}[wert]

        # make array of all values
        my @name = @{ $element{$name} };


Ask23: Ask23Wiki > TechDoc > PerlTricks || NeuesteAenderungen | Einstellungen
Diese Seite ist schreibgeschützt | Zeige andere Versionen dieser Seite | Durchsuche MetaWiki
Letzte Änderung am April 9, 2009 9:36 am von UlfT (Unterschied zur Vorversion)
Suche:
Wiki des archivsystem ak23