Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8569[/thread]

kleines zipping-prog: files zippen



<< >> 9 Einträge, 1 Seite
Duff
 2006-12-09 16:19
#72439 #72439
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

ich habe eine Frage zu einem kleinen zipping-programm, was ich mir geschrieben habe.

Mit dem Programm will ich alle Dateien, die älter als 1 Tag sind (also von gestern sind) zippen. Wenn die gezippte Datei bereits schon vorliegt, so sollte die Version von 1 auf 2, auf 3, usw. erhöht werden.

Mein Programm sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
my $usage;
#my $limitlog = 1800000000;
my $limitlog = 100000;
my $workdir="/feste/Verzeichnis/Struktur";
chdir ("$workdir");
my @files=`find . -mtime 1 -type f|xargs ls -t`;

if (scalar(@files)!=0) {
for my $file (@files) {
#print "$file\n";
chomp $file;
my @node = stat("$workdir/$file");
#print $node[7],"\n";
if ($file=~/\blog/ && $file!~/\b.gz/ && $node[7]>$limitlog) {
$version = $version+1;
$usage = "gzip -c $workdir/$file > /feste/Verzeichnis/Struktur/$file"."_#$version.gz";
#system ("$usage");
print $usage,"\n";
$usage = "cp /dev/null $workdir/$file";
#system ("$usage");
print $usage;
}
}
}


Allerdings bekomme ich bei einem Testaufruf immer folgende Fehlermeldung:

Code: (dl )
Use of uninitialized value in addition (+) at ./my_program line 20.


Er gibt zwar die Version 1 mit an bei der Ausgabe, jedoch stört mich die Fehlermeldung.
D'OH
Daniel
FIFO
 2006-12-09 16:27
#72440 #72440
User since
2005-06-01
469 Artikel
BenutzerIn

user image
wo wird $version denn initialisiert? Ggf. vorher explizit auf 0 setzen.

Gruß, FIFO
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
Duff
 2006-12-09 16:54
#72441 #72441
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Achso, du meinst einfach oben ein

my $version = 0;

schreiben.

Stimmt, hätte ich ja auch mal drauf kommen können.

Das ganze müsste aber doch sonst funktionieren, oder (ich meine das ganze Skript)?
D'OH
Daniel
renee
 2006-12-09 18:21
#72442 #72442
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es ist keine Fehlermeldung, sondern eine Warnung...

Benutzt Du Wiki:[tt]use strict[/tt]?

Warum benutzt Du so viele System-Aufrufe, wo es doch für alles ein Perl-Modul gibt? Es gibt z.B. CPAN:File::Find, um die find-Geschichte zu lösen, CPAN:File::Copy zum kopieren von Dateien und CPAN:Archive::Zip (und noch andere CPAN:Archive::*-Module) zum Packen von Dateien...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2006-12-09 19:28
#72443 #72443
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ja, ich benutze user strict.

Die Module hören sich interessant an, müsste ich mir aber dann noch mal genauer anschauen.

Aber wie muss ich die Regel basteln, damit beim Zippen eine Datei nicht überschrieben wird, sonder immer um 1 hochgezählt wird.

Z.B.
gezippte_datei_Datum_#1.log
gezippte_datei_Datum_#2.log
gezippte_datei_Datum_#3.log
usw.
D'OH
Daniel
topeg
 2006-12-09 19:33
#72444 #72444
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Schau mal bei deinem beitrag bei debainaforum.de
http://www.debianforum.de/forum/viewtopic.php?t=76993
Da hast du von mir ein Beispiel wie man "File::Find" verwenden kann. :-)
renee
 2006-12-09 19:37
#72445 #72445
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $file = 'gezippte_datei_Datum_#3.log';
my ($nr) = $file =~ m!#(\d+)\.log!;

while(1){
unless(-e $file){
last;
}
else{
++$nr;
my $file = 'gezippte_Datei_Datum#'.$nr.'.log';
}
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2006-12-09 21:26
#72446 #72446
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke, habe in meinem Skript nun folgende Zeilen ergänzt und hoffe, dass es funktioniert.

Code: (dl )
1
2
3
4
5
6
7
                        if ($file =~ m/#(\d+)\.gz/) {
$version = $1 + 1;
}
else
{
$version = $version+1;
}
D'OH
Daniel
topeg
 2006-12-09 22:56
#72447 #72447
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
statt:
Code: (dl )
1
2
3
$usage = "cp /dev/null $workdir/$file";
#system ("$usage");
print $usage;

solltest du:
Code: (dl )
unlink(workdir/$file);

verwenden, das ist schneller und einfacher. :-)
<< >> 9 Einträge, 1 Seite



View all threads created 2006-12-09 16:19.