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 全局符号";%formsequence“;在第37行需要显式的包名_Perl_Cgi - Fatal编程技术网

Perl 全局符号";%formsequence“;在第37行需要显式的包名

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

我正在尝试执行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 @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]的代码访问该数组)。