| 
 
        
 
 |  | 
 
         
          |   
              
28.4.2007 
 
 Hash of Arrays - Oder: Wie bilde ich ein Hash aus ArraysNachdem ich hier das Thema schonmal aufgegriffen habe (etwas versteckt vielleicht), möchte ich das Thema nochmal aufgreifen: Hash of Arrays, also ein Hash, der Arrays enthält.Hört sich nun etwas verquert an, ist aber ne schöne und effektive Sache, wenn man viele Daten im Systemspeicher verwalten will.
 
 Anlegen kann man so ein Array in einem Hash wie gewohnt per push(), also zum Beispiel
 
 | push (@{$hashname{$bezeichner}},$wert);
 # oder per Wertzuweisung
 @{$hashname{$bezeichner}}=@array;
 
 
 | 
 Weiterlesen...
 
 
  
 
 27.4.2007
 
 
 Speedtest File::FindWie ich hier ja schon berichtet habe, schien mit das Modul File::Find zu der Zeit etwas unflexibel.Grund dafür war die Tatsache, daß ich keine Dateiendungen übergeben konnte bzw. nicht festlegen konnte, wie viele Ebenen durchsucht werden sollen bzw. nur die aktuelle Ebene oder inklusive Unterebene.
 
 Dies ist zwar natürlich Möglich, aber leider nur per Umweg.
 Der Aufruf von File::Find erfolgt ja per
 Weiterlesen...
 
 
  
 
 26.4.2007
 
 
 Identische Dateien finden - Der Holzweg
 Zum ursprünglichen Beitrag
 Hier also der Code, der mich nicht weiter brachte.
 
 | use Digest::MD5 qw(md5);
 use strict;
 
 
 my %files=();
 my %dateien;
 my @nulllength=();
 my @dateisize=();
 my @dateien=get_all_files('c:/htdocs/',1,'.shtml');
 
 print "Es wurden ".@dateien." Dateien gefunden\n";
 
 ## Dateilänge holen und merken
 foreach (@dateien){
 open (my $IN,'<'.$_);
 my $dateilaenge=(stat($_))[7];
 
 binmode ($IN);
 read ($IN,my $key,100);
 close $IN;
 
 my $size="$dateilaenge|$key";
 
 # Ist Hash-Element der Dateigröße schon vorhanden???
 # Wenn nicht, dann Array anlegen, erster Wert ist die Dateigröße
 # Übrigens : Hier kann man die Verwendung eines Hashes mit (aus?) Arrays sehen
 push (@{$dateien{$size}},"$size") if (!defined @{$dateien{$size}});
 push (@{$dateien{$size}},$_);
 }
 
 # Ab hir steht in [filename,filename,filename]
 # jede Datei, aufgetielt nach Dateigroessen
 
 @dateien=();
 foreach (keys %dateien){
 my @dats=@{$dateien{$_}};
 # wenigstens 2 Filenamen müssen da sein, also @dats >= 3, da erster Eintrag die Dateilaenge
 next if @dats < 3;
 
 &get_checksum(@dats);
 }
 %dateien=();
 
 print qq~Dateien mit Nulllaenge:\n~;
 print join("\n",@nulllength);
 
 print qq~\n\nIdentische Dateien:\n~;
 
 foreach (keys %files){
 print "$files{$_}\n\n"  if (split('\n',$files{$_}) >1);
 }
 
 
 exit;
 
 ###################
 # Parameter
 # Startdir ohne abschließendes /, aktuelles Verzeichnis = .
 # Unterverzeichnisse durchsuchen? 1: ja, 0: nein
 # Dateitypen in form .txt.htm.html , also direkt hintereinander, aber nur wenn nötig
 # ansonsten wird alles gezeigt
 #############################################
 sub get_all_files{
 my $startdir=shift;
 my $include_subdirs=shift;
 my $endings=shift;
 my %endings=();
 $endings=~ s/\s//g;
 my @endings=split('\.',$endings);
 shift @endings;
 
 my $endings=0;
 $startdir=~ s/\/$//;
 
 if (@endings != 0){
 $endings=1; # wenn Endungen angegeben
 foreach (@endings){
 $endings{$_}=1;
 }
 }
 @endings=();
 
 my @dateien=();
 push (my @all_directories,$startdir);
 
 foreach my $akdir(@all_directories){
 local *in;
 opendir (in,$akdir);
 my @all=readdir(in);
 closedir in;
 
 foreach my $akdatei (@all){ next if ($akdatei eq '..' || $akdatei eq '.');
 if (-d "$akdir/$akdatei") {
 if ($include_subdirs == 1){
 push (@all_directories,"$akdir/$akdatei");
 next;
 }
 } else {
 if ($endings==0){
 push (@dateien,"$akdir/$akdatei");
 } else {
 my @endung=split('\.',$akdatei);
 my $endung=$endung[-1];
 if ($endings{$endung} == 1){
 push (@dateien,"$akdir/$akdatei");
 }
 }
 }
 }
 }
 return @dateien;
 }
 
 
 
 
 ######################
 # generiert Checksumme einer Datei
 #############################################
 sub get_checksum{
 my ($dateiname,$dateilaenge);
 my %tempfiles=(); # temporäre Files
 my $data='';
 
 $dateilaenge=shift;
 ($dateilaenge,my $dummy)=split('\|',$dateilaenge);
 
 return if $dateilaenge > 64000000;
 
 if ($dateilaenge == 0){ # Wenn Dateilaenge = 0, dann gleich alles ins Array und zurück
 push (@nulllength,@_);
 return;
 }
 
 my $firsthundret='';
 
 foreach $dateiname (@_){
 
 open (my $IN,'<'.$dateiname);
 binmode($IN);
 
 my $checksum = Digest::MD5->new->addfile(*$IN)->digest;
 close $IN;
 
 $files{$checksum}.="$dateiname\n";
 }
 }
 
 
 | 
 
 
 
  
 
 25.4.2007
 
 
 Identische Dateien auf dem Computer finden mit PerlVor kurzem stand ich vor dem Problem, daß auf einem von mir betreuten Webserver der Speicherplatz aufgebraucht war.
 Nach etwas herumsuchen stellte ich dann fest, daß es daran lag, daß viel Speicherplatz verschleudert wurde, weil viele identische Dateien mehrmals vorhanden waren.
 
 Was lag also näher, als ein kleines Perl-Programm zu schreiben, das doppelte (identische) Dateien findet?
 
 Weiterlesen...
 
 
  
 
 18.4.2007
 
 
 stat - Eigenschaften von Dateien ermittelnDie Funktion stat() ermittelt diverse Eigenschaften einer Datei auf einmal.
 Viele dieser Eigenchaften sind jedoch Unix-spezifisch. Manche dieser Eigenschaften lassen sich zwar auch auf anderen Plattformen erfragen, meist ist es jedoch einfacher, die  Dateitestoperatoren für Dateien/Verzeichnisse zu verwenden.
 Die Funktion stat läßt sich im Gegensatz zu  lstat nicht auf Dateirepräsentationen, sondern nur auf "Originale" von Dateien anwenden.
 
 Syntax
 @Eigenschaften=stat(Datei);
 Weiterlesen...
 
 
  
 
 17.4.2007
 
 
 unlink() - Dateien löschen in PerlDer Befehl unlink() löscht eine oder mehrere Dateien.
 
 Syntax
 $result = unlink ( Dateiename );
 
 oder
 Weiterlesen...
 
 
  
 
 14.4.2007
 
 
 rename - Dateien und Verzeichnis umbenennenMit dem Befehl rename können Sie Dateien und Verzeichnisse umbenennen.
 Der Syntax von rename lautet
 rename (Altername, Neuername);
 
 Altername gibt die Datei oder das Verzeichnis an, das geändert werden soll, Neuername ist der neue Verzeichnis- bzw. Dateiname.
 Vorsicht
 Wenn der erste Parameter eine Datei ist und der zweite Parameter der Name eines anderen Verzeichnisses,  wird die Datei in das andere Verzeichnis verschoben.
 Weiterlesen...
 
 
  
 
 13.4.2007
 
 
 Links finden - die FortsetzungNachdem ich hier ja schon über meine "Feldversuche" bezüglich dem Finden von Links auf Webseiten berichtet habe, scheine ich nun schon recht weit gekommen zu sein.
 Wer will kann sich ja mal die Ergebnisse ansehen und ein bißchen herumtesten.
 Zum Linkchecker bitte hier klicken.
 
 
  
 
 13.4.2007
 
 
 rmdir - Ein Verzeichnis löschen mit PerlMit rmdir kann man unter Perl ein Verzeichnis löschen. Dazu muß dieses Verzeichnis allerdings vollkommen leer sein, es dürfen auch keine weiteren, leeren, Unterverzeichnisse enthalten sein.
 
 Syntax
 rmdir (Verzeichnis);
 
 Wurde das Löschen erfolgreich durchgeführt, wird ein true zurückgegeben, andernfalls ein false. Zusätzlich findet man dann in $! eine Fehlermeldung im Textformat.
 Weiterlesen...
 
 
  
 
 12.4.2007
 
 
 chdir - Aktuelles Arbeitsverzeichnis definierenMit dem Befehl chdir legen Sie ein Verzeichnis als Arbeitsverzeichnis fest. Das bedeutet, daß man, ohne sich um den Verzeichnispfasd kümmern zu müssen, Dateien bearbeiten oder Scripte starten kann, die in diesem Verzeichnis liegen.
 
 Syntax
 chdir($pfad);
 
 Der Pfadname kann dabei relativ oder absolut verwendet werden. Außerdem ist es auch möglich, daß kein Pfadname angegeben wird. Dann wird das Verzeichnis verwendet, das in der Umgebungsvariablen HOME angegeben ist.
 Weiterlesen...
 
 
  
 
 11.4.2007
 
 
 Skalar durchsuchen und gefundene Ergebnisse in Array schreibenMal wieder etwas aus der Praxis:
 Ich stand (stehe) vor dem Problem, daß ich ein Skalar, oder genauer gesagt dem HTML-Quelltext einer Webseite nach Links durchsuchen mußte.
 Ich suchte also eine Möglichkeit, möglichst schnell alle Links nach dem Schema
 <a href="test.htm" .....>Linktext</a>
 zu finden und wenns denn geht gleich in ein Array zu schubsen.
 
 Weiterlesen...
 
 
  
 
 11.4.2007
 
 
 Dateitestoperatoren - Eigenschaften von Verzeichnissen und Dateien feststellenDie so genannten Dateitestoperatoren sind die schnellste und einfachste Methode in Perl, Eigenschaften von Dateien oder Verzeichnissen herauszufinden.
 Manche Operatoren geben dabei nur true oder false zurück, andere wiederum Zahlen, etwa die Größe einer Datei.
 
 Den Dateitestoperatoren wird ein - vorangestellt, danach folgt der Verzeichnis- bzw. Dateiname. Also zum Beispiel:
 
 | $size=-s 'dateiname.txt';
 print $size;
 
 
 | 
 Weiterlesen...
 
 
  
 
 10.4.2007
 
 
 Cookies mit PerlWill man einen User genau identifizieren, kann man neben der IP-adresse zusätzlich ein so genanntes Cookie verwenden.
 Cookies, zu deutsch Kekse oder Plätzchen, enthalten neben dem eigenen Identifier noch einen beliebigen Wert, ein Verfallsdatum und (wenn gewünscht) einen Pfad auf dem Webserver, für den sie gültig sind.
 Cookies werden von Browser gespeichert und senden bei jedem erneuten Aufruf ihre Daten an den Webserver, der daran erkennen kann, wer die Anfrage gesendet hat.
 Cookie-Daten werden übrigens meist (oder immer?) unverschlüsselt abgespeichert, deshalb bitte keine kritischen Daten damit übertragen!
 
 Weiterlesen...
 
 
  
 
 9.4.2007
 
 
 grep - Listen durchsuchen in PerlSyntax
 grep {BLOCK} ARRAY;
 oder
 grep (EXPR, ARRAY); bzw. grep EXPR,ARRAY;
 
 Der Befehl grep ist ein sehr mächtiger und universeller Befehl, mit dem sich bestimmte Einträge in Arrays finden lassen.
 Weiterlesen...
 
 
  
 
 8.4.2007
 
 
 rewinddir - Zeiger wieder auf den ersten Verzeichniseintrag setzenMit dem Befehl rewinddir() wird der Lesezeiger eines Directory-Handles wieder auf den Anfang gesetzt.
 Man kann den Befehl dazu verwenden, wenn ein bereits (teilweise) eingelesenes Verzeichnis erneut eingelesen werden soll.
 
 Syntax
 rewinddir(DIR);
 
 Weiterlesen...
 
 
  
 
 7.4.2007
 
 
 seek() - Dateizeiger neu positionieren
 Syntax
 seek(HANDLE,Positionswert,ABSOLUT-RELATIV-VOMENDE);
 
 Der Befehl seek setzt den Dateizeiger eines Dateihandles, das vorher mit open erzeugt wurde, an eine neue, beliebige Stelle.
 Dazu werden folgende Parameter verwendet:
 Weiterlesen...
 
 
  
 
 6.4.2007
 
 
 tell - Die Position eines Dateizeigers ermittelnDer Befehl tell() ermittelt die aktuelle Position eines Dateizeigers, der vorher mit open erzeugt wurde.
 
 Syntax
 $position=tell(HANDLE);
 
 $position ist die aktuelle Byteposition. Wenn ein Fehler aufgetreten ist, wird ein -1 zurückgegeben.
 Weiterlesen...
 
 
  
 
 5.4.2007
 
 
 Nochmal Dateien suchen - diesmal auch in UnterverzeichnissenIch hab ja hier schon ein Script vorgestellt, mit dem man bestimmte Dateien in einem Verzeichnis suchen kann.Und weil ich es grad aktuell gebraucht habe, hier eine Funktion, mit der man bestimmte oder auch alle Dateien in einem Ordner inklusive Unterordner suchen kann.
 
 Aber Vorsicht
 Wenn man die ganze Platte durchsuchen läßt, kann das schon mal länger dauern...
 
 | 
 use strict;
 
 my @dateien=get_all_files('../..',1,'.pl');
 
 print join("\n",@dateien);
 
 ###################
 # Parameter
 # Startdir ohne abschließendes /, aktuelles Verzeichnis = .
 # Unterverzeichnisse durchsuchen? 1: ja, 0: nein
 # Dateitypen in form .txt.htm.html , also direkt hintereinander, aber nur wenn nötig
 # ansonsten wird alles gezeigt
 #############################################
 sub get_all_files{
 my $startdir=shift;
 my $include_subdirs=shift;
 my $endings=shift;
 my %endings=();
 $endings=~ s/\s//g;
 my @endings=split('\.',$endings);
 shift @endings;
 
 my $endings=0;
 $startdir=~ s/\/$//;
 
 if (@endings != 0){
 $endings=1; # wenn Endungen angegeben
 foreach (@endings){$endings{$_}=1;}
 }
 @endings=();
 
 my @dateien=();
 push (my @all_directories,$startdir);
 
 foreach my $akdir(@all_directories){
 local *in;
 opendir (in,$akdir);
 my @all=readdir(in);
 closedir in;
 
 foreach my $akdatei (@all){ next if ($akdatei eq '..' || $akdatei eq '.');
 if (-d "$akdir/$akdatei") {
 if ($include_subdirs == 1){
 push (@all_directories,"$akdir/$akdatei");
 next;
 }
 } else {
 if ($endings==0){
 push (@dateien,"$akdir/$akdatei");
 } else {
 my @endung=split('\.',$akdatei);
 my $endung=$endung[-1];
 if ($endings{$endung} == 1){
 push (@dateien,"$akdir/$akdatei");
 }
 }
 }
 }
 }
 return @dateien;
 }
 
 
 | 
 Weiterlesen...
 
 
  
 
 4.4.2007
 
 
 closedir - Verzeichnis schließenSchließt das Handle eines Verzeichnisses, das vorher mit opendir geöffnet wurde.
 
 Syntax
 opendir(verzeichnis);
 
 
 | opendir(my $DIR,'../') || die "Kann Verzeichnis nicht öffnen: $!";
 foreach (my $eintrag=readdir($DIR)){
 print "$_\n";
 }
 closedir ($DIR);
 
 
 | 
 Weiterlesen...
 
 
  
 
 3.4.2007
 
 
 getc - Nächstes Zeichen aus Datei lesenDer Befehl getc() Liest ein Zeichen aus einer zuvor geöffneten Datei und positioniert den Dateizeiger um ein Zeichen weiter.
 getc ist die Abkürzung für get Char(akter), zu deutsch hole (ein) Zeichen.
 
 Syntax
 $zeichen=getc(HANDLE);
 
 | open (my $IN,'<datei.txt') || die "kann datei nicht oeffnen: $!";
 while ( !eof($IN) ){
 my $zeichen = getc($IN);
 print $zeichen;
 }
 close $IN;
 
 
 | 
 Weiterlesen...
 
 
  
 
 2.4.2007
 
 
 read() - Bestimmte Anzahl Zeichen aus Datei einlesenMit dem Befehl read() können eine bestimmte Anzahl von Zeichen aus einer Datei ab dem aktuellen Datei-Positions-Zeiger eingelesen werden.
 
 Syntax
 $gelesen=read(DATEIHANDLE,Skalar,Anzahl(,optional: Offset))
 
 Im Erfolgsfall wird die Anzahl der gelesenen Zeichen zurückgegeben, ansonsten eine 0 bei Dateiende und ein undef bei einem Fehler.
 Weiterlesen...
 
 
  
 
 1.4.2007
 
 
 close - Datei schließen in PerlMit close () schließen Sie eine Datei, die Sie zuvor mit open geöffnet haben.
 
 Syntax
 close(FILEHANDLE);
 
 
 Weiterlesen...
 
 
  
 
 
 |  |  | 
 
 
 
 
 
 
   
    
    
    |  |   
    | |  | Gelesene Beiträge insgesamt: 4483044
 | 
 
 |  
 
 
 
        
       
 
 
 |