Perl 全球符号“@str";需要显式的包名
我是Perl新手,我遇到了这个问题:Perl 全球符号“@str";需要显式的包名,perl,Perl,我是Perl新手,我遇到了这个问题: Global symbol "@str" requires explicit package name (did you forget to declare "my @str"?) at F:\Distrib\LingUtils9\Scripts\CompareLists\CompareLists.pl line 167 产生此消息的一段代码作为程序工作,但不作为子程序工作。如下所示: my $containsSub = 0; my $str = "Th
Global symbol "@str" requires explicit package name (did you forget to declare "my @str"?) at F:\Distrib\LingUtils9\Scripts\CompareLists\CompareLists.pl line 167
产生此消息的一段代码作为程序工作,但不作为子程序工作。如下所示:
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;
这是对行中子行内容的非常原始的验证,并且工作良好。但这(只是复制粘贴):
在命令行中生成此输出
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.
我只是不明白它是什么。这是因为perl字符串不像在某些语言中那样是字符数组 因此,
$str[3]
不是访问$str
的有效方式。但是,它将访问@str
的第三个元素,该元素不存在且尚未声明,因此会出现警告
如果希望按偏移量处理字符串,则需要substr
。或者my@chars\u in_str=split/,$str代码>
更广泛地说,这看起来像是一种尝试和正则表达式匹配的相当肮脏的方式
我建议你真正想做的是:
if ( $str =~ m/\b$substr\b/ ) {
$containsSub = 1;
}
\b
是perl正则表达式,表示“单词边界”,因此将使用标点或空格来匹配事物,尽管它并不严格等同于您正在做的事情(还有一大堆标点符号可以“工作”)
您还应该注意-如果$substr
包含元字符,它们将像正则表达式修饰符一样工作。为了避免这种情况,您需要关闭元字符处理的\b\Q$substr\E\b
代码通过执行$str[$indexOfSub…]
隐式使用@str
。显然,程序和sub的使用方式并不相同,可能是因为use strict代码>在驱动子组件的任何组件中。请添加使用strict编码>并声明所有内容。绝对使用警告
.zdim,谢谢:)您的回答不是一个解决方案,但它使这个问题更清楚。我添加了UseScrict,在程序中捕获了相同的错误。现在我明白了我的代码在语法上是不正确的(我对行中的字母的地址不正确),所以只需要将它替换为$str[$indexOfSub+length($substr)]=='?'
替换为substr($str,$indexOfSub+length($substr),1='?'
仅限yyep,在我看到索布里克的回答后,我明白了:)啊,一个漂亮的球:)是的!是的:)非常感谢$containsSub=$str=~m/\b\Q$substr\E\b/
if ( $str =~ m/\b$substr\b/ ) {
$containsSub = 1;
}