私には意味をなさない方法で動作する正規表現に問題があります。$line はスカラーへの参照です (この場合、文字列は 'print "hello world\n"') ですが、正規表現一致を実行しようとすると成功したように見えますが、$$line の値も変更されます。これに加えて、65 行目の $$line を変更しようとするとエラーが発生します。
コードは次のとおりです。
my $line = $_[0];
$$line =~ s/^(\s+\(?)//;
my @functions = ('print');
# Check if the expression is a function
for my $funcName (@functions) {
print $$line . "\n";
if ($$line =~ m/^($funcName\(?\s*)/) {
print $$line . "\n";
$$line =~ s/$1//; # THIS IS LINE 65
my $args = [];
while (scalar(@{$args}) == 0 || ${$line} =~ /\s*,/) {
push (@{$args}, parseExpression($line))
}
my $function = {
type => 'function',
name => $funcName,
args => $args
};
return $function;
}
}
出力は次のとおりです。
print "hello world\n"
print
Modification of a read-only value attempted at ./perl2python.pl line 65, <> line 3.
このコードは関数からの抜粋ですが、何が問題なのかを説明するには十分です。
出力の 2 行目は 1 行目と同じはずですが、if 句によって 2 つの print ステートメントの間で $$line が変更されているようです。
何かアドバイス??