Perl修改只读变量

时间:2013-10-03 06:47:20

标签: regex perl

我遇到的问题是正则表达式的行为对我来说没有意义。 $ line是对标量的引用(在本例中,字符串是'print'hello world \ n“')但是,执行正则表达式匹配的尝试似乎成功,但也更改了$$ line的值。除此之外,我在尝试修改第65行的$$行时遇到错误

以下是代码:

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.

此代码摘自函数,但它应足以说明出现了什么问题。

输出的第二行应该与第一行相同,但看起来$$行在两个print语句之间由if子句改变。

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

如果你消除了属于不属于问题的代码的所有混淆,消除子程序调用及其参数传递等等,你可以将问题归结为看起来像这样的代码: p>

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的其他标量变量,它是一个持有字符串引用的变量文字。