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

Scriptfehler



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2006-08-25 17:24
#69252 #69252
Hallo,

ich habe hier ein script welches ich so aufrufe: ./m3usript.pl inputdatei outputdatei

unter Windows wurde es erstellt und funktioniert dort tadellos, mit der gleichen perlversion. rufe ich es auf, kommt:

[frank@client ~]$ perl m3uscript.pl test.m3u test.erg
m3uscript.pl: line 7: syntax error near unexpected token `;'
m3uscript.pl: line 7: ` @a = <FIN>;'

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
#
if (open FIN, "@ARGV[0]")
{
if (open FOUT, ">@ARGV[1]")
{
@a = <FIN>;

$b = 1; $c = @a;
while ($c > 10)
{ $b++; $c/=10; }

for ($i=0; $i<@a; $i++)
{printf FOUT "%0" . $b . "d " . @a[$i], $i;}
close FOUT;
}
close FIN;
}
Crian
 2006-08-25 17:32
#69253 #69253
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
bei dem Skript gruselt es mir aber ...

1) kein use strict / use warnings
2) $b verwendet
3) @ARRAY[INDEX] verwendet
4) Zwei Statements in einer Zeile
5) unelegante for-Form
6) unnötige "..."
7) Ist * im Format von printf unbekannt?
8) imho unnötige Verschachtelung\n\n

<!--EDIT|Crian|1156513166-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
nepos
 2006-08-25 17:41
#69254 #69254
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Und vor allem:
Code: (dl )
#!/bin/sh
bei einem Perl-Skript.
Da muss ein
Code: (dl )
#!/usr/bin/perl
in die erste Zeile rein!
Kein die beim Open benutzen zum Abfangen von Fehlern, selbiger beim Close.
Crian
 2006-08-25 17:49
#69255 #69255
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Statt des die beim open macht er ja das if, aber der dicke Klopper mit dem sh ist mir entgangen und auch die Ursache des Fehlers =)

Unter Windows verknüpft das System über die Extension, unter Linux musst du es dann explizit mit "perl ..." aufrufen oder die richtige Shebang reinschreiben!
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2006-08-25 18:01
#69256 #69256
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich mach mal einen Gegenvorschlag:

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
#!/usr/bin/perl
use strict;
use warnings;

#
# Daten einlesen:
#
open FIN, $ARGV[0] or die $!;
my @lines = <FIN>;
close FIN or warn $!;

#
# Ausgabebreite berechnen:
#
my $stellen = int( 1 + log(scalar @lines) / log(10) );

#
# Daten ausgeben:
#
open FOUT, '>' . $ARGV[1] or die $!;
for my $i (0 .. $#lines) {
printf "%0*d%d", $stellen, $i, $lines[$i];
}
close FOUT or die $!;


(ungetestet)

Sollten die Dateien zu groß werden um sie komplett in den Speicher einzuladen, könnte man die Eingangsdatei zweimal einlesen, beim ersten Mal ermittelt man die Anzahl der Zeilen, beim zweiten Mal gibt man dann die Datensätze aus.\n\n

<!--EDIT|Crian|1156514686-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Frank#
 2006-08-25 18:17
#69257 #69257
User since
2006-08-25
3 Artikel
BenutzerIn
[default_avatar]
Nicht übel, allerdings sieht das input Format folgendermassen aus:

#EXTM3U
#EXTINF:-1,01- (reach up for the) sunrise
///root/gcc/backup/frank/Astronaut/01- (reach up for the) sunrise.mp3
#EXTINF:-1,02-want you more
///root/gcc/backup/frank/Astronaut/02-want you more.mp3
#EXTINF:-1,04-astronaut
///root/gcc/backup/frank/Astronaut/04-astronaut.mp3
#EXTINF:-1,07-taste the summer
///root/gcc/backup/frank/Astronaut/07-taste the summer.mp3
#EXTINF:-1,12-still breathing
///root/gcc/backup/frank/Astronaut/12-still breathing.mp3


usw
usw
usw

d.h die Zeilen hinter den Kommentaren sind überflüssig zu kommentieren :)
ausserdem wäre es auch sinnvoller die variablevor den Dateinamen zu hängen.

Ziel ist es diese Liste mkisofs zu übergeben, um das iso hinterher zu brennen
dafür hab ich

grep -v ^# test.erg | tr "\n" "\0" | xargs -0 mkisofs > /mnt/f/toll.iso


edit: bei deinem script kommt:

perl 1.pl test.m3u test.erg
Argument "#EXTM3U\n" isn't numeric in printf at 1.pl line 22.
Argument "#EXTINF:-1,01- (reach up for the) sunrise\n" isn't numeric in printf at 1.pl line 22.
Argument "///root/gcc/backup/frank/Astronaut/01- (reach up for the..." isn't numeric in printf at 1.pl line 22.
Argument "#EXTINF:-1,02-want you more\n" isn't numeric in printf at 1.pl line 22
Argument "///mnt/f/oasis/Oasis_Where Did It All Go Wrong.mp3\n" isn't numeric in printf at 1.pl line 22.
000000100020003000400050006000700080009001000110012001300140015001600170018001900200021002
200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440
045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006
700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890
090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011
201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340
135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015
701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790
18001810182018301840\n\n

<!--EDIT|Frank#|1156515569-->
renee
 2006-08-25 18:22
#69258 #69258
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann mach mal aus
Code: (dl )
1
2
3
open FIN, $ARGV[0] or die $!;
my @lines = <FIN>;
close FIN or warn $!;


Code: (dl )
1
2
3
open FIN, $ARGV[0] or die $!;
my @lines = grep{$_ !~ /^#/}<FIN>;
close FIN or warn $!;
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/
Frank#
 2006-08-25 18:26
#69259 #69259
User since
2006-08-25
3 Artikel
BenutzerIn
[default_avatar]
ok hab ich geändert, doch das Resultat ist ernüchternd:

[frank@client ~]$ perl 1.pl test.m3u test.erg
Argument "///root/gcc/backup/frank/Astronaut/01- (reach up for the..." isn't numeric in printf at 1.pl line 21.
Argument "///root/gcc/backup/frank/Astronaut/02-want you more.mp3\n" isn't numeric in printf at 1.pl line 21.
Argument "///root/gcc/backup/frank/Astronaut/04-astronaut.mp3\n" isn't numeric in printf at 1.pl line 21.
Argument "///root/gcc/backup/frank/Astronaut/07-taste the summer.m..." isn't numeric in printf at 1.pl line 21.

usw
usw
usw

Argument "///mnt/f/oasis/Oasis_Live Forever.mp3\n" isn't numeric in printf at 1.pl line 21.
Argument "///mnt/f/oasis/Oasis_Morning Glory.mp3\n" isn't numeric in printf at 1.pl line 21.
Argument "///mnt/f/oasis/Oasis_Supersonic.mp3\n" isn't numeric in printf at 1.pl line 21.
Argument "///mnt/f/oasis/Oasis_Where Did It All Go Wrong.mp3\n" isn't numeric in printf at 1.pl line 21.
000010020030040050060070080090100110120130140150160170180190200210220230240250260270280290
300310320330340350360370380390400410420430440450460470480490500510520530540550560570580590
600610620630640650660670680690700710720730740750760770780790800810820830840850860870880890
900910[frank@client ~]$
Crian
 2006-08-25 18:36
#69260 #69260
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
dann mach ein s aus dem d ^^

Code: (dl )
printf "%0*d%s", $stellen, $i, $lines[$i];
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Frank#
 2006-08-25 18:54
#69261 #69261
User since
2006-08-25
3 Artikel
BenutzerIn
[default_avatar]
funktioniert prima, bis auf das die ausgabe nicht in meine test.erg umgeleitet wird, stattdessen aber habe ich sie in der console

nun, aber wirds richtig schwierig: denn ich hab inzwischen folgendes am script geändert

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
#!/usr/bin/perl
#use strict;
#use warnings;

if (open FIN, "@ARGV[0]" )
{
       if (open FOUT, ">@ARGV[1]")
       {
               @a = <FIN>;

               $width = 1; $temp = @a;
               while ($temp > 10)
                       { $width++; $temp/=10; }

               for ($i=0, $index=0; $i<@a; $i++)
               {
                       if (substr(@a[$i],0,1) eq "#")
                       {
                               printf FOUT @a[$i];
                       }
                       else
                       {
                               @sp = split("/",@a[$i]);
                               $temp = @sp[$#sp];
                               @sp[$#sp] = "";
                               printf FOUT join("/",@sp) . "%0" . $width . "d_" . $temp, $index++;
                       }
               }
               close FOUT;
       }
       close FIN;
}


d.h er schreibt jetzt die varable direkt vor den Dateinamen, damit werden die files auch in der korrekten reihenfolge auf cd gebrannt, was ja das Hauptziel ausmacht.

grep wiederum müss nun versuchen zunächst aus einer noch _nicht_ geänderten test.m3u Liste Pfadangaben übernehmen, die bertreffenden Dateien umbennen, in nen tempordner copieren wo sie dann durchnummeriert mkisofs händeln kann. nIch sehe da aber ein unlösbares Problem

Wie soll das funktionieren können wenn ich nur eine test.m3u angeben kann ?


/Modedit: Codetags gefixt\n\n

<!--EDIT|GwenDragon|1156518227-->
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-08-25 17:24.