-1

如果它包含变量,我在子例程调用和打印到调试文件时遇到问题$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;

}
4

2 回答 2

4

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

另请注意,use utf8如果您的源文件包含 unicode 字符,您可能希望这样做。

编辑:CPAN 模块utf8::all尽可能接近 unicode 银弹,所以你可能更喜欢它。

于 2013-03-16T21:39:14.293 回答
3

您的声明命名变量

$ruleRegEX

但你用

$ruleRegEx

注意大小写不匹配。


此外,您声称您的源文件包含,但iso-8859-1ě中不存在该字符,并且您没有使用 UTF-8 来指示源文件编码。就 Perl 而言,您的源代码不包含.use utf8;ě

您应该无条件地拥有以下内容:

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

如果源文件使用 UTF-8 编码,您应该具有以下内容:

use utf8;

如果您的文件不是使用 io-8859-1 或 UTF-8 编码的,则应将其转换为 UTF-8,因为 Perl 只接受这两种编码的源代码。

于 2013-03-16T21:41:37.160 回答