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

a2p: Syntax error bei function?



<< >> 8 Einträge, 1 Seite
Matthias
 2005-04-22 11:27
#54132 #54132
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Hallo,

zur Zeit versuche ich, eine Sammlung von sh- und awk-Skripten (unter Windows) nach perl zu portieren. Teilweise ist auch awk in die sh-Skripte eingebettet.

Für awk habe ich das mitgelieferte a2p ausprobiert; allerdings bekomme ich einen "syntax error", sobald das awk-Skript eine function enthält. Ist das reproduzierbar oder mache ich etwas falsch?

Mein a2p meldet sich als revision 5.0 version 8.

Grüße

Matthias
Taulmarill
 2005-04-22 13:03
#54133 #54133
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
a2p hab ich seinerzeit auch nie zum laufen gebracht. mittlerweile schreib ich eh alles in Perl :)
imho bringt so was auch nicht viel, da awk als spezialisierterer interbreter eigendlich performanter sein müsste und a2p sicher nur begrenzt optimieren kann.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Matthias
 2005-04-22 13:07
#54134 #54134
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Ich habe auch nicht vor, a2p-erzeugten Code ungesehen zu übernehmen, sondern wollte die Ausgabe von a2p händisch in die aus den sh-Skripten erzeugten Perl-Skripten einpflegen; ich hielt das für sicherer als eine rein manuelle Umsetzung nach Perl, bei der es ja einige Fallen gibt.
betterworld
 2005-04-22 14:10
#54135 #54135
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Bei mir funktioniert a2p wunderbar. Betrachte dieses awk-Script:
Code: (dl )
1
2
function hello(x){print "hello " x ", how are you"}
{hello($1)}

Es wird zu folgendem Perl-Script:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if $running_under_some_shell;
# this emulates #! processing on NIH machines.
# (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
# process any FOO=bar switches

$, = ' '; # set output field separator
$\ = "\n"; # set output record separator

while (<>) {
($Fld1) = split(' ', $_, 9999);
&hello($Fld1);
}

sub hello {
local($X) = @_;
print 'hello ' . $X . ', how are you';
}

Zeig doch mal das awk-Script, welches nicht konvertierbar ist.\n\n

<!--EDIT|betterworld|1114164760-->
Matthias
 2005-04-22 16:56
#54136 #54136
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Hallo Betterworld,

Dein kleines Skript ließ sich bei mir auch übersetzen.

Jetzt habe ich eins von mir, das sich nicht übersetzen lässt, etwas gestrippt:

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
BEGIN   {
           Dup_sg          = "";
           Frei_sg         = "";
           Min_ig          = 99999999;
           Max_ig          = 0;
           LastFileDup_sg  = "";
       }

       
function PrintDup (From_iv, To_iv, File1_sv, File2_sv)
       {
           Dup_sg = Dup_sg sprintf ("Doppelt: %5d..%-5d %-10s  %s\n%-34s%s\n", From_iv, To_iv, "(" To_iv - From_iv + 1 " Stk)",
                                       File1_sv, "", File2_sv);
           LastFileDup_sg = "";
       }

function PrintFrei (From_iv, To_iv)
       {
           Frei_sg = Frei_sg sprintf ("Frei:    %5d..%-5d %-10s\n", From_iv, To_iv, "(" To_iv - From_iv + 1 " Stk)");
       }

       

END     {

               FreiFrom_ii = FreiTo_ii = 0;
               From_ii = To_ii = Min_ig;
               LastFile_si = "";
               for (I_ii = Min_ig; I_ii <= Max_ig; I_ii++)
               {

                  if ( LastFileDup_sg != "")
                  {
                           PrintDup(From_ii, To_ii, LastFileDup_sg, LastFile_si);
                           From_ii = I_ii;
                  }
                   else
                   {
                       if (LastFileDup_sg != "")
                           PrintDup(From_ii, To_ii, LastFileDup_sg, LastFile_si);
                       From_ii = To_ii = I_ii;
                   }

                       if ( FreiFrom_ii != 0)
                           PrintFrei(FreiFrom_ii, FreiTo_ii);

               }
               printf ("%s", Dup_sg);
               printf ("%s", Frei_sg);
       }


liefert einen syntax error bei der ersten "function..."-Zeile.
Wenn ich die beiden function-Zeilen auskommentiere und stattdessen vor die function-Blöcke irgendwelche Patterns setze, lässt es sich übersetzen.

Grüße

Matthias
Matthias
 2005-04-25 12:46
#54137 #54137
User since
2005-04-22
18 Artikel
BenutzerIn
[default_avatar]
Inzwischen habe ich es gefunden:

a2p mag es nicht, wenn zwischen Funktionsname und Parameterliste ein Leerzeichen steht.

also:

function PrintDup(From_iv,To_iv,File1_sv,File2_sv)
{
}

lässt sich nach Perl übersetzen.
ptk
 2005-04-25 18:06
#54138 #54138
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Schick' mal einen Bugreport per perlbug!
betterworld
 2005-04-26 00:57
#54139 #54139
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
In der Manpage von gawk steht:
Quote
The left parenthesis in a function call is required to immediately fol-
low the function name, without any intervening white space. This is to
avoid a syntactic ambiguity with the concatenation operator. This
restriction does not apply to the built-in functions listed above.


Das bezieht sich zwar nur auf Funktionsaufrufe und nicht auf Deklarationen, aber ueber Letzteres habe ich nichts explizites gefunden. Nur Implizites:
Quote
Functions in AWK are defined as follows:

function name(parameter list) { statements }

Da ist auch kein Leerzeichen dazwischen.
<< >> 8 Einträge, 1 Seite



View all threads created 2005-04-22 11:27.