Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 全球符号“@str";需要显式的包名_Perl - Fatal编程技术网

Perl 全球符号“@str";需要显式的包名

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

我是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 = "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;
}