Jeg leger lidt med Filter::Simple.
Jeg har lavet flg modul, Perlgol.pm, en slags Bournegol for Perl, og det
opfører sig lidt besynderligt:
package Perlgol;
use Filter::Simple;
$debug = 1;
FILTER_ONLY code => sub {
print STDERR "Filtering: $_" if $debug;
s/:=/=/g;
s/def (.+?) = fun\((.*?)\)/sub $1 { my($2) = \@_;/g;
# s/let (.+?) = (.+?);/my($1) = ($2);/g;
s/nuf/}/g;
s/while (.+?) do/while ($1) {/g;
s/until (.+?) do/until ($1) {/g;
s/for (.+?) in (.+?) do/for my $1 ($2) {/g;
s/for (.+?) from (.+?) to (.+?) do/for($1 = $2 ; $1 <= $3 ;
($1)++) {/g;
s/for (.+?) from (.+?) to (.+?) by (.+?) do/for($1 = $2 ; $1 <=
$3 ; ($1)+=($4)) {/g;
s/od/}/g;
s/if (.+?) then/if ($1) {/g;
s/else (.+?) then/} elsif ($1) {/g;
s/else/} else {/g;
s/fi/}/g;
print STDERR "Transform: $_" if $debug;
};
1;
Det skulle jo være ganske simpelt.
Følgende testcase:
#! /usr/pkg/bin/perl -w
use strict;
use Perlgol;
def min = fun($x,$y)
return $x if $x < $y ;
return ($y);
nuf
virker fint.
Men tilføjer jeg en linie til sidst, fx "exit;", får jeg:
easy
/src $ perl testcase 2>&1 | cat -v
Filtering:
def min = fun($x,$y)
return $x if $x < $^\^@^@^@^@^\
Transform:
sub min { my($x,$y) = @_;
return $x if $x < $^\^@^@^@^@^\
Filtering: Transform: syntax error at testcase line 10, near "nuf
exit"
Missing right curly or square bracket at testcase line 10, at end of line
Execution of testcase aborted due to compilation errors.
(De nul-bytes som cat -v viser, er vist et udtryk for Filter::Simples
måde at "maskere" strenglignende ting på, når man bruger FILTER_ONLY.)
Erstatter jeg nu systematisk '$y' med '$z', så virker det hele igen. Det
er som om der er noget der kan få Filter::Simple til at misforstå et y
som y///-operatoren (sed-"kompatibelt" synonym for tr///), der jo er
quotelike. Jeg kan bare ikke forstå hvorfor det at tilføje en i øvrigt
harmløs linie skal medføre det.
Er der en Perl-guru der kan fortælle mig hvad det er jeg gør forkert
(jeg ved godt at den måde jeg laver det på i øvrigt er primitiv, med
mulighed for fejl, manglende check af word-boundaries etc, men lad det
nu ligge - det her er bare en slags proof-of-concept), eller skal jeg
bare fluks sende en mail til Damian Conway?
Testet med perl5.8.3, 5.8.4 og 5.8.5. Filter::Simple er et
standardmodul, men jeg har også prøvet med CPAN versionen, 0.79.
--
Lasse Hillerøe Petersen | "I met someone who looks a lot like you,
----------------------------+ she does the things you do;
No Windows | but she is an IBM"
= No virus | (Jeff Lynne, "Yours truly 2095")