Thread rekursion klappt nicht (9 answers)
Opened by supersucker at 2006-02-09 21:07

supersucker
 2006-02-09 21:07
#62814 #62814
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
hi,

da mein k3b gelegentlich trotz korrekter joliet-einstellungen beim brennen von mp3 mit nicht brennfreundlichen namen abschmiert und ich demnächst auf arbeit auch wieder perl programmieren muss, dachte ich mir meine verstaubten perl-kenntnisse wieder aufzufrischen in dem ich mir ein script schreibe das rekursiv alle verzeichnisse durchgeht und audio-dateien einen brennfreundlichen, im sinne von keine sonderzeichen und keine überlänge, dateinamen vergibt.

leider gibt mir mein erster versuch einen fehler mit dem ich nicht wirklich weiter komme.

das script:

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
#!/usr/bin/perl

use strict;
use warnings;

#####################################################################
#
#
# script which scans recursively all folders based on #
# the current directory and renames audio file-names #
# to a burn-friendly format
#
#

#
#####################################################################


# constants &nb
sp; #

use constant MAX_FILENAME_LENGTH => 31;

# main script
#

print "start renaming files....\n";

scanDir();

print "finished renaming files....\n";

# functions &nb
sp; #

sub scanDir {

# open current directory

opendir(CURDIR, ".") or die "could not open directory! \n";

# iterate over directory entries

while(my $dirEntry = <CURDIR>) {

# skip "." and ".."

if($dirEntry eq "." || $dirEntry eq "..") {
next;
}

# if we encounter a audio-file

if(-f $dirEntry && $dirEntry =~ m/(.*mp3$)|(.*ogg$)/) {
renFile($dirEntry);
}

# if we encounter a directory, descend into it and start recursion

elsif(-d $dirEntry) {
chdir($dirEntry) or die "could not open directory $dirEntry! \n";
scanDir();
}

}
return 0;
}



sub renFile {


my $newFileName = my $oldFileName = shift;

# delete all special chars

$newFileName =~ s/[^a-zA-Z0-9_\,-]//;

# shorten file name if necessary and rebuild filename

$newFileName = substr($newFileName, 0, MAX_FILENAME_LENGTH) . substr($oldFileName, -4)
if(length($newFileName) > MAX_FILENAME_LENGTH);

rename ($oldFileName, $newFileName) or die "could not rename file $oldFileName !\n";

return 0;
}


führe ich das in der shell aus krieg ich:

Code: (dl )
1
2
3
4
5
 ./rectFileNames.pl
start renaming files....
readline() on unopened filehandle CURDIR at ./rectFileNames.pl line 37.
(Are you trying to call readline() on dirhandle CURDIR?)
finished renaming files....


kann mit dieser fehlermeldung jemand was anfangen?

hab ich hier irgendwas offensichtliches übersehen?

hoffe ihr könnt mir helfen!

ps: ich weiss das es für sowas genügend module gibt die rekursiv verzeichnisse durchgehen, würde es aber halt interessehalber gerne selber machen

pps: hmmpf, war ja klar das mir forum wieder meine formatierung zerhaut.......\n\n

<!--EDIT|supersucker|1139512449-->

View full thread rekursion klappt nicht