Perl 全局符号";%formsequence“;在第37行需要显式的包名
我正在尝试执行Perl CGI脚本,但遇到一个错误:Perl 全局符号";%formsequence“;在第37行需要显式的包名,perl,cgi,Perl,Cgi,我正在尝试执行Perl CGI脚本,但遇到一个错误: Global symbol "%formsequence" requires explicit package name at line 37. 我做了一些研究,发现use strict迫使我在使用变量或存储任何数据之前声明变量,但在我的程序中我声明了变量,这就是我不理解错误的原因。这是我的剧本: #!/usr/bin/perl -w use strict; my %errors; my %form; my @formsequen
Global symbol "%formsequence" requires explicit package name at line 37.
我做了一些研究,发现use strict
迫使我在使用变量或存储任何数据之前声明变量,但在我的程序中我声明了变量,这就是我不理解错误的原因。这是我的剧本:
#!/usr/bin/perl -w
use strict;
my %errors;
my %form;
my @formsequence;
my %fields = (
"lname" => "Last Name",
"phone" => "Phone",
"fname" => "Fist Name"
);
my %patterns = (
"lname" => '[A-Z][a-z]{2,50}',
"phone" => '\d{3}-\d{3}-\d{4}',
"fname" => '[A-Z][A-Za-z]{2,60}'
);
@formsequence = ("lname", "phone", "phone");
print "content-type/html\n\n";
if ($ENV{REQUEST_METHOD} eq "POST") {
&readformdata;
if (&checkrequiredfields) {
print "Form Data validated successfully!";
}
else {
foreach (keys (%fields)) {
if ($fields{$_} != $formsequence{$_}) { <-- line 37
$errors{$_}="Not in correct sequence\n";
}
}
}
#/usr/bin/perl-w
严格使用;
我的错误百分比;
我的%表格;
我的@formsequence;
我的%fields=(
“lname”=>“姓氏”,
“电话”=>“电话”,
“fname”=>“名字”
);
我的%patterns=(
“lname”=>“[A-Z][A-Z]{2,50}”,
“电话”=>“\d{3}-\d{3}-\d{4}”,
“fname”=>“[A-Z][A-Za-Z]{2,60}”
);
@formsequence=(“lname”、“phone”、“phone”);
打印“内容类型/html\n\n”;
如果($ENV{REQUEST_METHOD}eq“POST”){
&readformdata;
如果(&checkrequiredfields){
打印“表单数据验证成功!”;
}
否则{
foreach(键(%fields)){
如果($fields{$\u}!=$formsequence{$\u}){我怀疑您可能是从PHP开发人员的角度来看待“数组”的概念。在Perl中,哈希和数组是独立的数据结构
数组是使用@
前缀声明的,您使用整数索引周围的方括号引用元素:
my @names = ('Tom', 'Dick', 'Larry');
say $names[0]; # 'Tom'
say $names[-1]; # 'Larry'
my $count = @names; # $count now equals 3
foreach my $i (0..$#names) {
say $names[$i];
}
散列是使用%
前缀声明的,您引用的元素在字符串键周围使用大括号:
my %rgb = (
red => '#ff0000',
white => '#ffffff',
blue => '#0000ff',
);
say $rgb{'red'}; # '#ff0000'
say $rgb{blue}; # '#0000ff' quotes optional around bareword keys
foreach my $k (keys %rgb) {
say $rgb{$k};
}
您通常不会在数组上使用键
函数-事实上,较旧版本的Perl甚至不支持它,较新版本将返回一系列整数(例如:0..2
)
在散列上调用键时,键没有固有的顺序,并且顺序可能会改变
其他值得知道的事情:
使用&
调用函数是一种非常古老的方式(即90年代初),现在我们使用readformdata()
而不是&readformdata
!=
运算符是一个数值比较运算符,因此只在比较的值实际上是数字时使用它。如果要检查两个字符串是否“不相等”,则使用ne
(例如:如果($thing1 ne$thing2){…}
)。这似乎是一些比较古老的Perl
- 您可以在shebang行中使用
-w
,而不是使用warnings
(自2000年发布Perl 5.6.0以来,该行一直可用)
- 您(大概)使用一个自定义的
readformdata()
函数来代替CGI,pm的params()
方法。CGI.pm是在1997年添加到Perl核心的(它最近被删除了,但这不是不使用它的理由)
- 在函数调用中使用符号,自从1994年Perl5发布以来,就不需要这些符号了
您的问题是由于声明了一个数组,@formsequence
,然后尝试将其作为哈希访问-$formsequence{$\u}
意味着,“在哈希%formsequence
中查找键$\ucode>。在Perl中,数组和哈希是两种完全不同的数据类型,这是可能的(尽管不推荐使用相同名称的数组和散列,希望是出于明显的原因)
您可以这样声明数组-使用@
:
my @array = ('foo', 'bar', 'baz');
并使用[…]
访问如下单个元素:
print $array[0]; # prints 'foo'
您可以像这样声明哈希-使用“%”:
my %hash = (foo => 'Foo', bar => 'Bar', baz => 'Baz');
并使用{…}
访问像ths这样的单个元素:
print $hash{foo}; # prints 'Foo'
数组使用整数编制索引并排序。哈希使用字符串编制索引并无序
我无法为您的代码提出修复建议,因为您还不清楚要做什么。您似乎希望检查参数是否以特定的顺序出现,但这注定会失败,因为a)您无法保证CGI参数从浏览器传输到web服务器的顺序,b)您不能保证键(%fields)
从%字段中返回键的顺序
如果你能更详细地解释一下你想做什么,那么我们也许能给你更多的帮助。你声明了一个数组,但后来试图像访问散列一样访问它。@dsm我想循环数组,所以我必须执行$formsequence{$}
@JohnAmbers你不能执行$formsequence{$}
因为您没有名为%formsequence
的散列。您只有名为@formsequence
的数组(您可以使用类似$formsequence[$integer]的代码访问该数组)。
。