我遇到子程序调用问题,如果它包含变量$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;
}
答案 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仅接受这两种编码中的源代码。