我是新用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