|
|
28.4.2007
Hash of Arrays - Oder: Wie bilde ich ein Hash aus Arrays Nachdem 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::Find Wie 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 Perl Vor 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 ermitteln Die 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 Perl Der Befehl unlink() löscht eine oder mehrere Dateien.
Syntax $result = unlink ( Dateiename );
oder Weiterlesen...
14.4.2007
rename - Dateien und Verzeichnis umbenennen Mit 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 Fortsetzung Nachdem 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 Perl Mit 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 definieren Mit 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 schreiben Mal 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 feststellen Die 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 Perl Will 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 Perl Syntax 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 setzen Mit 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 ermitteln Der 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 Unterverzeichnissen Ich 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ßen Schließ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 lesen Der 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 einlesen Mit 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 Perl Mit close () schließen Sie eine Datei, die Sie zuvor mit open geöffnet haben.
Syntax close(FILEHANDLE);
Weiterlesen...
|
|
|
|
| Gelesene Beiträge insgesamt: 4423889 |
|
|