0

我遇到了正则表达式的问题,其行为方式对我来说没有意义。$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.

这段代码是一个函数的摘录,但是它应该足以说明出了什么问题。

输出的第二行应该与第一行相同,但似乎 $$line 正在通过 if 子句在两个打印语句之间进行更改。

有什么建议吗??

4

1 回答 1

5

如果您消除了不属于问题一部分的代码的所有混淆,消除了子例程调用及其参数传递等,您可以将问题归结为如下代码:

my $line = \"Hello world!\n"; # $line contains a reference to a string literal.
$$line =~ s/Hello/Goodbye/;

当您运行它时,您将收到Modification of a read-only value attempted...消息,因为您无法修改字符串文字。

添加my某个固定位置的事实可能只是意味着您的新词法$line掩盖了其他一些名为 的标量变量$line,该变量包含对字符串文字的引用。

于 2013-10-03T06:58:20.683 回答