我是新用Perl,我已经面临这个问题:全局符号“@str”需要明确的包名
Global symbol "@str" requires explicit package name (did you forget to declare "my @str"?) at F:\Distrib\LingUtils9\Scripts\CompareLists\CompareLists.pl line 167
一段代码,导致此消息,可以作为一个PROGRAMM,但不起作用。这是它:
my $containsSub = 0;
my $str = "This is a string!";
my $substr = "string";
my $indexOfSub = index($str, $substr);
if ($indexOfSub != -1)
{
if (length($substr)==length($str))
{
$containsSub = 1;
}
elsif (($indexOfSub == 0)&&(($str[$indexOfSub + length($substr)]=='?')||($str[$indexOfSub + length($substr)]=='!')||($str[$indexOfSub + length($substr)]=='.')||($str[$indexOfSub + length($substr)]==' ')||($str[$indexOfSub + length($substr)]=='\t')))
{
$containsSub = 1;
}
elsif ((length($str) == $indexOfSub + length($substr))&&(($str[$indexOfSub-1]=='.')||($str[$indexOfSub-1]==' ')||($str[$indexOfSub-1]=='\t')||($str[$indexOfSub-1]=='?')||($str[$indexOfSub-1]=='.')||($str[$indexOfSub-1]=='!')))
{
$containsSub = 1;
}
elsif ((($str[$indexOfSub-1]=='?')||($str[$indexOfSub-1]=='!')||($str[$indexOfSub-1]=='.')||($str[$indexOfSub-1]==' ')||($str[$indexOfSub-1]=='\t'))||(($str[$indexOfSub+length($substr)]=='?')||($str[$indexOfSub+length($substr)]=='!')||($str[$indexOfSub+length($substr)]=='.')||($str[$indexOfSub+length($substr)]==' ')||($str[$indexOfSub+length($substr)]=='\t')))
{
$containsSub = 1;
}
}
print $containsSub;
这是非常原始的行中的子行内容验证,并且它工作正常。但是,这(只是copypaste):
sub containsKey
{
my $containsSub = 0;
my $str = "This is a string!";
my $substr = "string";
my $indexOfSub = index($str, $substr);
if ($indexOfSub != -1)
{
if (length($substr)==length($str))
{
$containsSub = 1;
}
elsif (($indexOfSub == 0)&&(($str[$indexOfSub + length($substr)]=='?')||($str[$indexOfSub + length($substr)]=='!')||($str[$indexOfSub + length($substr)]=='.')||($str[$indexOfSub + length($substr)]==' ')||($str[$indexOfSub + length($substr)]=='\t')))
{
$containsSub = 1;
}
elsif ((length($str) == $indexOfSub + length($substr))&&(($str[$indexOfSub-1]=='.')||($str[$indexOfSub-1]==' ')||($str[$indexOfSub-1]=='\t')||($str[$indexOfSub-1]=='?')||($str[$indexOfSub-1]=='.')||($str[$indexOfSub-1]=='!')))
{
$containsSub = 1;
}
elsif ((($str[$indexOfSub-1]=='?')||($str[$indexOfSub-1]=='!')||($str[$indexOfSub-1]=='.')||($str[$indexOfSub-1]==' ')||($str[$indexOfSub-1]=='\t'))||(($str[$indexOfSub+length($substr)]=='?')||($str[$indexOfSub+length($substr)]=='!')||($str[$indexOfSub+length($substr)]=='.')||($str[$indexOfSub+length($substr)]==' ')||($str[$indexOfSub+length($substr)]=='\t')))
{
$containsSub = 1;
}
}
return $containsSub;
}
my $keyContains = containsKey();
print $keyContains;
使得在命令行
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
3.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
3.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
3.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
3.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
3.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
7.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
7.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
7.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
7.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
7.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 16
7.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 17
1.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 17
1.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 17
1.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 17
1.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 17
1.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 17
1.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 17
1.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 17
1.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 17
1.
Global symbol "@str" requires explicit package name (did you forget to declare "
my @str"?) at \Compare.pl line 17
1.
Execution of \Compare.pl aborted
due to compilation errors.
这个输出,我只是不明白那是什么。
该代码通过执行'$ str [$ indexOfSub ...]'隐式使用'@ str'。显然,程序和子程序的使用方式并不相同,可能是因为在任何驱动器中使用“严格的”。请添加'use strict;'并声明一切。并且绝对地使用警告; – zdim
zdim,谢谢:)你的回答不是一个解决方案,但它使这个问题更清晰。我添加了使用scrict,在程序中遇到了同样的错误。现在我明白我的代码在语法上是不正确的(我错误地处理了这些行的字母),所以需要用它代替 – Fruling
,所以需要替换'$ str [$ indexOfSub + length($ substr)] = ='?''用'substr($ str,$ indexOfSub + length($ substr),1)=='?''只有 – Fruling