/ HomePage / Computer / Software / Programmierung / Schnipsel
Perl Schnippsel
Wer kennt das nicht: da programmiert man Tag ein Tag aus und dann kommt jemand und fragt, wie dies oder das noch mal eben ging...
Perl direkt aus der Shell ohne extra Programmdatei
Aktuelles Datum als YYMMDD
perl -e '($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();\
$date = sprintf("%02d%02d%02d", ($year % 100), ($mon + 1), $mday);print $date;'
oder kürzer
perl -e 'use POSIX qw(strftime);$str=strftime "%y%m%d",localtime;print $str."\n";'
Datum als YYYYMMDD
perl -e '($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();\
$date = sprintf("%04d%02d%02d", ($year + 1900), ($mon + 1), $mday);print $date;'
oder kürzer
perl -e 'use POSIX qw(strftime);$str=strftime "%Y%m%d",localtime;print $str."\n";'
Anmerkung: Arbeitet man z.B. in einer Bash Shell unter Unix Systemen (cygwin auch) ist folgendes etwas kürzer.
Dieses sinnfreie Zeile soll nur zeigen, wie man Perl dazu bringt etwas zu interpretieren, ohne daß eine Quelltext-Datei erstellt werden muss. Die Ausgabe ist die Prozess-ID des Prozesses des Perl-Interpreters, die es nach Abarbeitung der Zeile nicht mehr gibt.
Zählschleife
perl -e 'for ($i=0; $i<10;$i++) { print "$i\n";}'
Ausgabe:
0
1
2
3
4
5
6
7
8
9
if then else
if (condition)
{
expression(s)
}
[ elsif (condition) { ... } ]²
[ else { ... } ]³
- ²) Darf beliebig oft vorkommen
- ³) Darf genau einmal vorkommen
Erfragen des aktuellen Systems
perl -e 'print $^O."\n";'
perl -e "print $^O;" Extrawurst für Windows
Ausgaben:
| Ausgabe: | System |
| linux | Gentoo Linux |
| solaris | Solaris Intel x86 |
| solaris | Solaris Sun Sparc |
| darwin | Apple Macintosh x86 (Mac Mini) |
| cygwin | Windows cygwin environment |
| * 4NT: Unknown command "perl" | Windows 2003 Server, 4NT Shell, Perl nicht installiert |
| Can't find string terminator "'" anywhere before EOF at -e line 1. | Perl call unter Windows braucht eine Extrawurst |
| MSWin32 | Windows XP 32bit |
Traverse Directorys
Es gibt auch noch File::Find, allerdings kommt es da ab und zu zu etwas kruden Ergebnissen, die dann doch nur mit der opendir() Methode gelöst werden können, weshalb ich Lars File::Find (leider) abgeneigt bin.
# perl
use File::Find qw(find);
$mydir= '/path/to/search';
sub wanted
{
if ($_ =~/\.html$/ && -T $File::Find::name) # html und heuristic Text
{
print $File::Find::name, "\n";
}
}
find(\&wanted, $mydir);
Das funktioniert noch ganz prima, aber wehe man nutzt die %options nebst no_chdir=1 und hat symbolische links, dann funktioniert das ganze nämlich nicht unbedingt.
Dann kommen solche komischen Fehlermeldungen. Wo ich Lars dann nur noch sage 6, setzen.
Can't use string ("no_chdir") as a subroutine ref while "strict refs" in use at /usr/lib/perl5/5.8.8/File/Find.pm line 822.
at /usr/lib/perl5/5.8.8/File/Find.pm line 822
File::Find::_find_dir('HASH(0x99ce798)', '/tmp', 46) called at /usr/lib/perl5/5.8.8/File/Find.pm line 700
File::Find::_find_opt('HASH(0x99ce798)', 1, 'wanted', 'CODE(0x99c51f0)', '/tmp') called at /usr/lib/perl5/5.8.8/File/Find.pm line 1223
File::Find::find('no_chdir', 1, 'wanted', 'CODE(0x99c51f0)', '/tmp') called at /tausch/lla/traversedir.pl line 25
main::traverse() called at /tausch/lla/traversedir.pl line 11
siehe auch
Links