-1

variable が含まれている場合、サブルーチン呼び出しとデバッグ ファイルへの出力に問題があります$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-1use utf8;に存在せず、ソースファイルがUTF-8を使用してエンコードされていることを示すために使用しませんでした。Perlに関する限り、ソースには。が含まれていませんě

無条件に次のものが必要です。

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

また、ソースファイルがUTF-8を使用してエンコードされている場合は、次のものが必要です。

use utf8;

ファイルがio-8859-1またはUTF-8を使用してエンコードされていない場合、Perlはこれら2つのエンコードのソースコードのみを受け入れるため、ファイルをUTF-8に変換する必要があります。

于 2013-03-16T21:41:37.160 に答える