2013-03-16 30 views
-1

我有一個子程序調用和打印的問題進行調試文件,如果它包含變量$ruleRegExp全球符號「%s」需要明確的包名

我運行該腳本,這些PARAMS:

./script --help --input=input --output=vystup --format=regulars 

正是它說:

Global symbol "$ruleRegEx" requires explicit package name at ./script line 68. 
Global symbol "$ruleRegEx" requires explicit package name at ./script line 69. 
Execution of ./script aborted due to compilation errors. 

我試圖想通了其中的問題,並閱讀論壇,但我還沒有找到一個事務所問題與這個問題。

我寫在我的國家語言註釋,所以不講究的意見 - 的代碼行,我認爲都與此有關的錯誤有上殼的意見。

我的整個代碼是:

#!/usr/bin/perl 

use strict; 
use Getopt::Long; 
use Fcntl; 

# použité proměné 
my $help; # pro nastavení parametru help 
my $br; # pro nastavení parametru br 




my $formatFile; 
my $inputFile; 
my $outputFile; 
my $string; #řetězec načtený ze vstupního souboru 
my $ruleRegEX; #DECLARED HERE 
my $ruleConsequence; #řetězec, definuje obsah tagu pro daný reg. výraz 

#použité funkce 
sub readInput; 
sub readRule; 

GetOptions (
    "help"  => \$help, 
    "br"  => \$br, 
    "format=s" => \$formatFile, 
    "input=s"  => \$inputFile, 
    "output=s" => \$outputFile 
); 

#checkParams() 

print "Help = $help\n"; 
print "br = $br\n"; 
print "format = $formatFile\n"; 
print "input = $inputFile\n"; 
print "output = $outputFile\n"; 

#Debugovací soubor pro kontrolní výpisy 
sysopen DEBUG, "Debug", O_WRONLY | O_CREAT or die "Debug soubor se nepodařilo otevřít. $!\n"; 
    print DEBUG "Debug: Debug soubor otevřen.\n"; 

#otevře formátovací soubor pro čtení, převádí jeho vstup do utf8 a pokud se otevření nepovede vrací chybové hlášení 
open FORMAT, "$formatFile" or die "Formátovací soubor se nepodařilo otevřít. $!\n"; 
print DEBUG "Debug: Formátovací soubor otevřen.\n"; 

#otevře vstupní soubor 
if ($inputFile) { 
    open STDIN, "<$inputFile" or die "Vstupní soubor se nepodařilo otevřít. $!\n"; 
    print DEBUG "Debug: Vstupní soubor otevřen.\n"; 
} 

#otevře výstupní soubor, pokud neexistuje vytvoří jej. 
if ($outputFile) { 
    sysopen STDOUT, "$outputFile", O_RDWR | O_CREAT or die "Výstupní soubor se nepodařilo otevřít. $!\n"; 
    print DEBUG "Debug: Výstupní soubor otevřen.\n"; 
    #otestovat úspěch zápisu 
    print STDOUT "Debug: Pokusný zápis.\n" 
} 


readInput ($string); #načte vstup 
print DEBUG "Debug: Vstup:\"$string\"\n"; 

#načte z formátovacího souboru jedno pravidlo do proměnných ruleRegEx a ruleConsequence 
readRule($ruleRegEx, $ruleConsequence); #USED HERE 
print DEBUG "Debug: ruleRegEx = \"$ruleRegEx\"\n"; #AND HERE 

#useRule(); 



sub checkParams { 
    my ($help, $br, $formatFile, $inputFile, $outputFile) = @_; 
} 

# Funkce pro načtení vstupu ze vstupního souboru 
#$_[0] = proměnná, do které se bude načtený vstup zapisovat 

sub readInput($$) { 
    local $/ = undef; 
    $_[0] = <STDIN>; 
    print DEBUG "Debug: načten vstup:\n"; 
} 

#Funkce pro načtení jednotlivých částí jednoho pravidla z formátovacího souboru. 
#$_[0] - rexulární výraz 
#$_[1] - definice vlastností tagu 
sub readRule($$) { 
    my $rule = <FORMAT>; 
    my $divider = "\t"; 
    my $index = index($rule, $divider); 
    print DEBUG "Debug: \$index = \"$index\""; 
    $_[0] = substr $rule, 0, $index-1; 

} 
+0

除了'使用嚴格的;'在頂部,你還需要使用'警告;'。 – 2013-03-16 23:20:50

回答

4

在你的$ruleRegEx聲明不小心大寫字母x,你實際上已經聲明的變量$ruleRegEX

還要注意,如果你的源文件中包括Unicode字符,你可能想use utf8

編輯:CPAN模塊utf8::all儘可能接近unicode silver bullet,因此您可能更喜歡這樣做。

+1

非常感謝,你安全我。 – 2013-03-16 21:54:37

+0

很高興提供幫助。在這裏SO upvotes和接受是通常的方式來感謝幫助你的人。歡呼,歡迎來到SO。 – 2013-03-16 22:09:13

+0

添加'use utf8;'只有一半修復了這個問題。你會得到寬字符錯誤。查看我的答案以獲得完整修復。 – ikegami 2013-03-17 19:36:27

3

你的名字聲明變量

$ruleRegEX 

但是你用

$ruleRegEx 

注意的情況下不匹配。


而且,你要求你的源文件中包含ě,但性格不iso-8859-1存在,並且你沒有使用use utf8;註明出處文件使用UTF-8編碼。就Perl而言,您的源代碼不包含ě

您應該無條件執行以下操作:

use open ':std', ':locale'; 

而且你應該有以下如果源文件使用UTF-8編碼:

use utf8; 

如果你的文件沒有使用編碼io-8859-1或UTF-8,您應該將其轉換爲UTF-8,因爲Perl只接受這兩種編碼中的源代碼。

相關問題