PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perlscript macht probleme



Tuxist
27-02-2005, 17:45
Ich wollte mit diesem script mp3's und wma's umwandeln in oggg leider wandelt es nur mp3's um.
Ich ich wüsste gerne wie man unterordner öffnen kann.

#! /usr/bin/perl

### mp3 and wma to ogg by darklinux presents

$dir=`pwd`;

chop($dir);

opendir(checkdir,"$dir");

while ($file=readdir(checkdir)) {
$orig_file=$file;

if ($orig_file !~ /\.mp3$/i) {next};
print "Checking file: $orig_file\n";
$new_wav_file=$orig_file;$new_wav_file=~s/\.mp3/\.wav/;
$new_ogg_file=$orig_file;$new_ogg_file=~s/\.mp3/\.ogg/;
$convert_to_wav="mplayer \"./$orig_file\" -ao pcm -aofile \"./$new_wav_file\"";
$convert_to_ogg="oggenc -q 4 \"./$new_wav_file\" \"./$new_ogg_file\"";
$remove_wav="rm -rf \"./$new_wav_file\"";
$remove_mp3="rm -rf \"./$orig_file\"";
print "EXEC 1: $convert_to_wav\n";
$cmd=`$convert_to_wav`;
print "EXEC 2: $convert_to_ogg\n";
$cmd=`$convert_to_ogg`;
print "REMOVE WAV: $remove_wav\n";
$cmd=`$remove_wav`;
print "REMOVE MP3: $remove_mp3\n";
$cmd=`$remove_mp3`;
print "\n\n";

elsif ($orig_file !~ /\.wma$/i) {next};
print "Checking file: $orig_file\n";
$new_wav_file=$orig_file;$new_wav_file=~s/\.wma/\.wav/;
$new_ogg_file=$orig_file;$new_ogg_file=~s/\.wma/\.ogg/;
$convert_to_wav="mplayer \"./$orig_file\" -ao pcm -aofile \"./$new_wav_file\"";
$convert_to_ogg="oggenc -q5 \"./$new_wav_file\" \"./$new_ogg_file\"";
$remove_wav="rm -rf \"./$new_wav_file\"";
$remove_wma="rm -rf \"./$orig_file\"";
print "EXEC 1: $convert_to_wav\n";
$cmd=`$convert_to_wav`;
print "EXEC 2: $convert_to_ogg\n";
$cmd=`$convert_to_ogg`;
print "REMOVE WAV: $remove_wav\n";
$cmd=`$remove_wav`;
print "REMOVE WMA: $remove_wma\n";
$cmd=`$remove_wma`;
print "\n\n";

}

use Gtk;
use strict;
set_locale Gtk;
init Gtk;
my $false = 0;
my $true = 1;
my $window = new Gtk::Window( "toplevel" );
my $button = new Gtk::Button( "Fertig" );
$window->signal_connect( "delete_event", \&CloseAppWindow );
$button->signal_connect( "clicked", \&CloseAppWindow );
$button->show();
$window->border_width( 15 );
$window->add( $button );
$window->show();
main Gtk;
exit( 0 );
sub CloseAppWindow
{
Gtk->exit( 0 );
system('exit');
return $false;
exit
}

michael.sprick
28-02-2005, 07:48
ähm... nimms nicht persönlich, aber meiner meinung nach macht dort so einiges Probleme.

Kannst Du kurz beschreiben, was konkret der Fehler ist? Bei Dir?

Tuxist
28-02-2005, 13:25
das Script wandelt ja um nur halt mp3s und keine wmas

michael.sprick
01-03-2005, 08:15
OK, dann fang ich einfach mal an:

1)
Benutze immer das Perl Pragma 'strict'. Tust Du es nicht, wirst Du nur dazu verleitet, unsauberen code zu schreiben.
Auch die warnings; werden Dir immer eine große Hilfe sein.
Übrigens: Das Einbinden dieser Schemen verlangsamt die Skripte nicht und vergrößert auch nicht den Prozess - entgegen den Behauptungen mancher Unwissender.


#!/usr/bin/perl

use strict;
use warnings;


2)
Filehandles und Directoryhandles werden immer in Großbuchstaben geschrieben.
also

opendir(HANDLE,"$dir");


2)
chop(); entfernt ausnahmslos das letzte Zeichen in einem String. Du willst aber das Newline-Zeichen entfernen...dafür nimmst Du
chomp();

3)
Du hast einen Elseif Zweig ohne If (und da dürfte Dein eigentliches Problem liegen).


if ($orig_file !~ /\.mp3$/i) {next};

Das heißt:
Wenn am Ende des Strings $orig_file NICHT ".mp3" steht, dann springe zum nächsten Schleifendurchlauf. Fertig!
Du benutzt die einzeilige Syntax - da gibts kein else und auch kein elseif.

Das folgende
elsif ($orig_file !~ /\.wma$/i) {next}; steht also völlig Kontextfrei. Und funktioniert daher garnicht. Würde es funktionieren, brächte es trotzdem nicht den gewünschten Erfolg.
Lösung:


if($orig_file =~ m/\.mp3$/i)
{
#Code zum umwandeln einer MP3-Datei
}
elseif($orig_file =~ m/\.wma$/i)
{
#Code zum umwandeln einer WMA-Datei
}
else
{
#Code für NICHT-Audio Dateien
}

4) Unterverzeichnisse öffnest Du genauso wie jedes andere Verzeichnis auch - mit opendir().



opendir(DH,"."); #öffne aktuelles Verzeichnis
while(readdir(DH) )
{
if(-d $_)
{
#Ist ein Unterverzeichnis....
}
}


Da Du aber auch in Unterverzeichnissen wieder Unterverzeichnisse haben kannst, und das beliebig oft, wäre das Ganze ein Fall für Rekursion. Am Besten packst du den Code zum Öffnen eines Verzeichnisses und dem Konvertieren der darin befindlichen Dateien in eine SubFunktion. Die rufst Du dann aus dem Hauptprogramm einmal auf und für alle weiteren Unterverzeichnisse ruft sie sich selber auf...

5)
Das GTK Fensterchen steht auch völlig Zusammenhangslos im Raum - es öffnet sich halt einfach. Es gibt keine Kontrolle, ob und wie viele Dateien konvertiert wurden ... aber das war vermutlich Absicht, oder?

Tuxist
21-03-2005, 12:46
danke geht jetzt bis auf deas öffnen von unterverzeichnissen das mit dem Fenster war absicht.

Wo muss das hin ?


opendir(DH,"."); #öffne aktuelles Verzeichnis
while(readdir(DH) )
{
if(-d $_)
{
#Ist ein Unterverzeichnis....
}
}