全局符号“%s”需要显式包名称

时间:2013-03-16 21:36:08

标签: perl

我遇到子程序调用问题,如果它包含变量$ruleRegExp,则打印到调试文件。

我用这些参数运行脚本:

./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;

}

2 个答案:

答案 0 :(得分:4)

在您$ruleRegEx的声明中,您意外地将字母x大写,您实际上已经声明了变量$ruleRegEX

另请注意,如果源文件包含unicode字符,则可能需要use utf8

修改:CPAN模块utf8::all尽可能接近unicode银弹,所以您可能更喜欢。

答案 1 :(得分: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仅接受这两种编码中的源代码。