2013-10-03 103 views
0

我遇到了一個正則表達式對我來說沒有意義的問題。 $ line是對標量的引用(在這個例子中,字符串是'print'hello world \ n「'),但是執行正則表達式匹配的嘗試似乎成功了,但也改變了$$行的值。除了這個,我在嘗試修改第65行Perl對只讀變量的修改

這裏$$線當錯誤代碼:

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. 

此代碼是一個函數的摘錄,但它應該足以說明發生了什麼問題。

輸出的第二行應該與第一行相同,但是在if語句的兩個打印語句之間出現$$ line正在被改變。

有什麼建議?

+2

使用'use strict;使用警告;'第一個 –

+0

它現在使用嚴格和警告。已經在使用警告,嚴格只需要把'我'放在變量前面 – Lobe

回答

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變量,這是舉行一個字符串字面量的參考之一。