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

aktuelles Verzeichnis (Seite 2)

Leser: 2


<< |< 1 2 3 4 5 >| >> 44 Einträge, 5 Seiten
coax
 2005-05-15 19:41
#54898 #54898
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Quote
Code: (dl )
1
2
3
4
5
6
foreach(@size)
{
my $i = 0;
$fileindex{$i}=$sizeindex{$file[$i]};
$i++;
}

Sorry, das ist ganz schoen umstaendlich und unsauber.

All das kann man etwas kuerzer fassen...
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
25
26
#!/usr/bin/perl

 use strict;
 use warnings;

 use vars qw(%files);

 opendir(DIR, '.') or die $!;

 $files{$_} = -s for grep -e && -f, readdir( DIR );
 
 closedir(DIR);

 printf("%s\t%s\n", human_readable_fsize($files{$_}), $_ )
      for sort { $files{$a} <=> $files{$b} } keys %files;

 sub human_readable_fsize {
     my(@units) = qw(Bytes KB MB GB TB);
     my $i = $_[0] >= 1099511627776 # 1024 ** 4
                 ? 4 : $_[0] >= 1073741824 # 1024 ** 3
                     ? 3 : $_[0] >= 1048576 # 1024 ** 2
                         ? 2 : $_[0] >= 1024
                             ? 1 : 0;

     return sprintf('%.2f %s', $_[0] / 1024 ** $i, $units[$i]);
 }
\n\n

<!--EDIT|coax|1116171965-->
,,Das perlt aber heute wieder...'' -- Dittsche
J-jayz-Z
 2005-05-16 00:40
#54899 #54899
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Oh mist, ich hab noch viel Arbeit vor mir, wenn ich mir das so anschau...
Ich hab das jetzt so gemacht:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perl
use strict;
use warnings;

use Cwd;

my $dir = getcwd;
opendir(DIR, "$dir");
my @array = readdir(DIR);
closedir(DIR);

my %hash;
my %for;
my @size;
my $data;

format STDOUT_TOP =
Dateiname Dateigroesse
====================================
.

foreach(@array)
{
my $i = 0;
$hash{$_} = (-s $_);
my $file = (-s $_);
$for{$file} = $_;
$i++;
push @size, $file;
}
my @sort = sort { $a <=> $b } @size;
foreach(@sort)
{

if (-f, "$for{$_}" && !(-d "$for{$_}"))
{
my $data = $_;
if ($_ < 1024)
{
$_ .= " bytes";
} elsif ( $_ > 1024 && $_ < 1048576)
{
$_ = sprintf("%.2f", $_ / 1024);
$_ .= " kb";
} elsif ( $_ > 1048576 && $_ < 1099511627776)
{
$_ = sprintf("%.2f", $_ / 1048576);
$_ .= " mb";
} else
{
$_ = sprintf("%.2f", $_ / 1099511627776);
$_ .= " gb";
}
format STDOUT =
@<<<<<<<<<<<<<<<<< @>>>>>>>>>>>>>>
$for{$data}, $_
.
write;
}


}

Bitte sagt mir, das das auch gut ist :p
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
coax
 2005-05-16 01:51
#54900 #54900
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=J-jayz-Z,15.05.2005, 22:40]Bitte sagt mir, das das auch gut ist :p[/quote]
Hmm, viel scheinst nicht von mir uebernommen zu haben, was ? ;)

Code: (dl )
$hash{$_} = (-s $_);

Hier fuellst du dir doch den %hash mit den Dateinamen als Schluessel und der Groesze als Wert, also warum brauchst du dann noch einmal...
x) ... die Groesze in einer weiteren Variable ?
Code: (dl )
1
2
my $file = (-s $_);
$for{$file} = $_;


x) ... den Dateinamen in einen Array ?
Code: (dl )
push @size, $file;


Und was macht das $i noch hier ? ??? Das wird doch nicht mehr verwendet... oder ? *g*
Code: (dl )
$i++;


Das heiszt also, @size und der %for-Hash koennen doch wegfallen, denn all die Daten
die du brauchst erreichst du doch ueber deinen %hash.
Unter der Bedingung muss dann
Code: (dl )
my @sort = sort { $a <=> $b } @size;

natuerlich etwas komplizierter werden
Code: (dl )
my @sort = sort { $hash{$a} <=> $hash{$b} } keys %hash;

aber, ,,hey!'', dadurch sparst du dir zwei weitere Variablen ein und dein
Code bekommt ein bisschen mehr Uebersichtlichkeit (bis auf das sort-Konstrukt).

Haeufig verwendeter Code, wie die Konvertierung der Dateigroesze in ein lesbares Format, solltest du dir schon in eine Subroutine legen.

Lass hoeren... :)\n\n

<!--EDIT|coax|1116194054-->
,,Das perlt aber heute wieder...'' -- Dittsche
J-jayz-Z
 2005-05-16 02:08
#54901 #54901
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Oh man, das wollte ich nicht hören *g
aber das:
Code: (dl )
my @sort = sort { $hash{$a} <=> $hash{$b} } keys %hash;

ist ja auch schwachsinn, oder? was soll das $hash{$a} ? die variablen $a und $b gibt es doch gar nicht...
Das soll sort doch nur sagen, wie es sortieren soll...oder?!
Na ja, das $i hab ich irgendwie von meiner Vorversion vergessen zu streichen *g
Na ja, die Variable mit der größe habe ich, damit ich danach überhaupt mit dem array arbeiten kann. Ich will ja eine Liste, damit die Schleife es dem Inhalt nach oft durchläuft.
Den hash habe ich ja, damit die Ausgabe der Dateigröße auch zur Datei passt...
Na ja, ich war offline, wegen meinen Eltern und hab dann das script offline fertig geschrieben, ohne deinen Vorschlag zu übernehmen...
Aber wenn ich ihn mir so anschaue, muss ich mir doch noch einige Bücher kaufen *gg*
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
pKai
 2005-05-16 02:29
#54902 #54902
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=J-jayz-Z,16.May.2005, 00:08]ist ja auch schwachsinn, oder? was soll das $hash{$a} ? die variablen $a und $b gibt es doch gar nicht...
...
Aber wenn ich ihn mir so anschaue, muss ich mir doch noch einige Bücher kaufen *gg*[/quote]
Im Zweifelsfalle würde schonmal das Studium der perldoc, also hier von perldoc -f sort weiterhelfen, bzw. solche unbedachten Äußerungen verhindern helfen ;)
I sense a soul in search of answers.
J-jayz-Z
 2005-05-16 03:02
#54903 #54903
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
deshalb ja das oder *g
Ich bin nunmal totaler newbie was das angeht...
Ich bin vermutlich grad mal so alt, wie einige von euch schon programmieren *gg*
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
coax
 2005-05-16 03:08
#54904 #54904
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=J-jayz-Z,16.05.2005, 00:08]Na ja, die Variable mit der größe habe ich, damit ich danach überhaupt mit dem array arbeiten kann. Ich will ja eine Liste, damit die Schleife es dem Inhalt nach oft durchläuft.
Den hash habe ich ja, damit die Ausgabe der Dateigröße auch zur Datei passt...
[/quote]
Du kannst auch in deiner Schleife mit dem Hash ,,als Liste'' arbeiten... 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
25
26
27
28
29
my @sort = sort { $a <=> $b } @size;
foreach(@sort)
{

      if (-f, "$for{$_}" && !(-d "$for{$_}"))
      {
      my $data = $_;
              if ($_ < 1024)
      {
              $_ .= " bytes";
      } elsif ( $_ > 1024 && $_ < 1048576)
      {
              $_ = sprintf("%.2f", $_ / 1024);
              $_ .= " kb";
      } elsif ( $_ > 1048576 && $_ < 1099511627776)
      {
              $_ = sprintf("%.2f", $_ / 1048576);
              $_ .= " mb";
      } else
      {
              $_ = sprintf("%.2f", $_ / 1099511627776);
              $_ .= " gb";
      }
format STDOUT =
@<<<<<<<<<<<<<<<<< @>>>>>>>>>>>>>>
$for{$data},          $_
.
write;
}


wuerde dann
Code: (dl )
1
2
3
4
5
6
7
8
9
10
foreach my $filename ( sort { $hash{$a} <=> $hash{$b} } keys %hash )
{
   next unless -f $filename;

   format STDOUT =
@<<<<<<<<<<<<<<<<< @>>>>>>>>>>>>>>
   human_readable_fsize( $hash{$filename} ),          $filename
.
write;
}

werden.
Wie du siehst ist der if-Block, der sich ueber die ganze Schleife erstreckte, weggefallen. Wir kehren naehmlich die Bedingung um und springen sofort zum naechsten Durchlauf (next unless -f $filename naechster Durchlauf wenn $filename keine regulaere Datei).
Ich hab auch wieder die Unterroutine human_readable_fsize() mit rein genommen, wie du sie benennst ist egal, deinen Code (der die Groesze konvertiert) solltest du aber schon in eine Subroutine auslagern.

Innerhalb der Schleife kannst du nun also durch $hash{$filename} auf die Groesze zugreifen, dann kannst du dem Hash auch gleich noch einen schoeneren Bezeichner geben, %sizes, %filesizes oder %files wuerde sich anbieten.

Mir ist da noch einmal der Fehler aufgefallen...
Code: (dl )
if (-f, "$for{$_}" && !(-d "$for{$_}"))

Hinter den Dateitest-Operatoren darf hier kein Komma folgen (-f, "$for{$_}"), denn dem Operator wuerde sonst das Argument fehlen und dann ist der Aufruf aequivalent zu -f $_.
Der Operator -f liefert ja nur wahr wenn er auf eine regulaere Datei trifft, das schlieszt also aus, dass es ein Verzeichnis ist, der Test mit -d kann also wegfallen. Ich denke mal, dass du zusaetzlich mit -d getestet hast, weil -f wegen des Kommas das falsche Ergebnis lieferte.

Quote
Aber wenn ich ihn mir so anschaue, muss ich mir doch noch einige Bücher kaufen *gg*

Oefters im Board mitlesen und auf Fragen antwortenAntworten ist da auch schon recht hilfreich, da lernt man ziemlich viel was nicht in den Buecher stehen tut :)
,,Das perlt aber heute wieder...'' -- Dittsche
J-jayz-Z
 2005-05-16 03:19
#54905 #54905
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
okay, ich werde es mir merken mit dem mitlesen und antworten und so!
Ich hab ja schon Programmieren mit Perl und das Perl Kochbuch hier, aber ich glaub, das war etwas früh gekauft *g
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
Strat
 2005-05-16 14:24
#54906 #54906
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=J-jayz-Z,16.05.2005, 01:19]Ich hab ja schon Programmieren mit Perl und das Perl Kochbuch hier, aber ich glaub, das war etwas früh gekauft *g[/quote]
ich finde, diese beiden Buecher und perldoc reichen fuer den Basisbedarf eigentlich voellig aus; nur wenn man spezielle Sachen machen will (wie z.B. Tk oder mod_perl), sollte es wohl noch 1-2 Buecher vom Osterhasen (oder aehnlicher Sagengestalt) abgeben.

Der Gedankenaustausch mit anderen (z.B. ueber Foren) bringt aber zusaetzlich zum Buecherwissen eine Menge; ich hatte, als bevor zum Vor-Vorgaengerforum von hier kam, ein einigermaszen solides Buecherbasiswissen (und hielt mich deshalb fuer den grossten Perl-Programmierer ueberhaupt, weil ich einfach nicht wusste, wie und mit welchen Mitteln andere Leute arbeiten, aber die koennen das sicher nicht besser machen als ich ;-) ), aber fand durch die gestellten Fragen und Antworten schnell heraus, wie "korrekt" ich mein Wissen und meine Faehigkeiten eingeschaetzt hatte und wie viel es noch zu lernen gab (wenn ich nur an meine ersten CGI-Scripte zurueckdenke... *grusel*).

Ich lerne hier viele interessante neue Sachen und Ideen und kann mein Wissen und meinen Weg, bestimmte Probleme anzugehen, dadurch besser hinterfragen und oft verbessern.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
J-jayz-Z
 2005-05-16 19:58
#54907 #54907
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hmm, okay. Danke für die neue Ansichtsweise !
So hab ich das noch gar nicht gesehen...
Aber ich kann dich beruhigen, bei meinem ersten CGI Script habe ich ums verrecken den Fehler nicht gefunden, den ich gemacht habe. Einige Zeit später ist mir dann aufgefallen, dass ich beim Apache vielleicht was ändern sollte, wenn ich Perl aufm webserver ausführen will. Soviel zu dem Thema :p
Aber mal zurück zu meinem Script-"Versuch" hier.
Ich wollte jetzt noch Schalter via Getopt::Std einbauen. Habe ich auch getan, aber er will ums verrecken kein Verzeichniss mit -d /path/to/dir annehmen...
Aber hier mal die sourcen...:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/usr/bin/perl
use strict;
use warnings;

use Cwd;

use Getopt::Std;
use vars qw($opt_f $opt_h $opt_d);

my $test=0;
my $name;
my $wert;
my $dir;

if (! getopts('f:hd:'))
{
}

if ($opt_h)
{
print "Usage:\n";
print "filesize.pl -h for help\n";
print "filesize.pl -f [filename] to show the size of [filename]\n";
print "filesize.pl -d [directory] to show the sizes of all files in [directory]\n";
print "filesize.pl to show the sizes of all files in the current directory\n";
}
elsif ($opt_f)
{
my $f = getcwd;
opendir(DIR, "$f");
my @dir = readdir(DIR);
closedir(DIR);
foreach (@dir)
{
if ($_ eq $opt_f)
{
$test=1;
}
}
if ($test)
{
$_ = (-s "$opt_f");
$wert = &size($_);;
$name = $opt_f;
write;
}
else {
print "Datei $opt_f exisiert nicht!\n";
}
}

$dir = getcwd unless(defined($opt_d));
if (defined($opt_d))
{
if (-d "$opt_d")
{
$dir = $opt_d;
} else {
print "$opt_d existiert nicht oder ist kein Verzeichniss!\n";
exit 0;
}
}

unless (defined($opt_h) || defined($opt_f))
{
opendir(DIR, "$dir");
my @array = readdir(DIR);
closedir(DIR);

my %hash;
my %for;
my @size;

format STDOUT_TOP =
Dateiname Dateigroesse
====================================
.

foreach(@array)
{
my $i = 0;
$hash{$_} = (-s $_);
my $file = (-s $_);
$for{$file} = $_;
$i++;
push @size, $file;
}
my @sort = sort { $a <=> $b } @size;

foreach(@sort)
{

if (-f "$for{$_}")
{
my $data = $_;
&size($_);
$name = $for{$data};
$wert = $_;
format STDOUT =
@<<<<<<<<<<<<<<<<< @>>>>>>>>>>>>>>
$name, $wert
.
write;
}
}
}


sub size
{
if ($_ < 1024)
{
$_ .= " bytes";
} elsif ( $_ > 1024 && $_ < 1048576)
{
$_ = sprintf("%.2f", $_ / 1024);
$_ .= " kb";
} elsif ( $_ > 1048576 && $_ < 1099511627776)
{
$_ = sprintf("%.2f", $_ / 1048576);
$_ .= " mb";
} else
{
$_ = sprintf("%.2f", $_ / 1099511627776);
$_ .= " gb";
}
return $_;
}

Könnt ihr mir zum einen Sagen, wieso Getopt::Std unbedingt diese Zeile brauch, das aber nicht ausgeführt wird, wenn kein Schalter gegeben ist?
Code: (dl )
1
2
3
if (! getopts('f:hd:'))
{
}

ohne das geht Getopt::Std nicht...
Und wenn ich mit dem Schalter -d /path/to/dir/ arbeite, bekomm ich folgende Fehlermeldung:
Code: (dl )
1
2
3
4
5
rootcris@ingo:~/scripts$ ./filesize.pl -d /home/rootcris/filme/
Use of uninitialized value in hash element at ./filesize.pl line 84.
Use of uninitialized value in sort at ./filesize.pl line 88.
Use of uninitialized value in sort at ./filesize.pl line 88.
Use of uninitialized value in hash element at ./filesize.pl line 93.

Die Schalter -h und -f gehen aber Problemlos...
HILFE!!! ;)
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
<< |< 1 2 3 4 5 >| >> 44 Einträge, 5 Seiten



View all threads created 2005-05-15 02:55.