Perl - 在for循环中验证参数的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl - 在for循环中验证参数的问题相关的知识,希望对你有一定的参考价值。

该脚本捕获5x2输入字段。

for ($i=0;$i<6;$i++) {

   $zeit_[$i] = $q->param("zeit_[$i]");
   $tatigkeit_[$i] = $q->param("tatigkeit_[$i]");

   ##validation

   if (!$zeit_[1]) 
      {&error('Bitte geben Sie mindestens eine Aktivität an!');}
   if ($zeit_[$i] =~ /D/) 
      {&error('Die Zeitangabe zur Aktivität "'. $tatigkeit_[$i] . '"enthält ein unzulässiges Zeichen! Bitte geben Sie nur ganze Zahlen an!');}
   if ($tatigkeit_[$i] =~ /[^A-Za-z0-9öäüÖÄÜß-s]/) 
      {&error('Die Tätigkeit "' . $tatigkeit_[$i] . '" enthält ein unzulässiges Zeichen!');}

   #prepare the output
   if ($zeit_[$i]) {$ausgabe.= $zeit_[$i] . " mit " . $tatigkeit_[$i] . " ID: $i<br>";}

}
print "Content-type: text/html

";
print $ausgabe; exit();

我的问题是这个验证(必须填写第一个输入):

if (!$zeit_[1]) 
  {&error('Bitte geben Sie mindestens eine Aktivität an!');}

验证子程序error在所有情况下都会发生。空输入,也填充一个或所有五个输入。

当我对验证进行否定时

if ($zeit_[1]) 
  {&error('Bitte geben Sie mindestens eine Aktivität an!');}

qazxsw poi也出现了。我认为问题是var qazxsw poi

当我用error禁用验证时 - 脚本运行正常。输出显示所有10个元素。

可能有人给我一个提示?

This update fixed the problem

$zeit_[1]改为#。正确代码:

for ($i=0;$i<6;$i++)
答案

我猜这是一个简单的拼写错误。但是你没有向我们展示你期望的输入数据,所以除了猜测之外别无他法。

(我也猜测这是一个使用CGI.pm编写的CGI程序 - 如果你能在你的问题中指出这一点会更好。)

在验证中,您有:

for ($i=1;$i<6;$i++)

但在其他验证线上,您有:

for ($i=1;$i<6;$i++) {

   $zeit_[$i] = $q->param("zeit_[$i]");
   $tatigkeit_[$i] = $q->param("tatigkeit_[$i]");

   ##validation

   if (!$zeit_[1]) 
     {&error('Bitte geben Sie mindestens eine Aktivität an!');}
   if ($zeit_[$i] =~ /D/) 
     {&error('Die Zeitangabe zur Aktivität "'. $tatigkeit_[$i] . '"enthält ein unzulässiges Zeichen! Bitte geben Sie nur ganze Zahlen an!');}
   if ($tatigkeit_[$i] =~ /[^A-Za-z0-9öäüÖÄÜß-s]/) 
     {&error('Die Tätigkeit "' . $tatigkeit_[$i] . '" enthält ein unzulässiges Zeichen!');}

   #prepare the output
   if ($zeit_[$i]) {$ausgabe.= $zeit_[$i] . " mit " . $tatigkeit_[$i] . " ID: $i<br>";}

}
print "Content-type: text/html

";
print $ausgabe; exit();

在一个案例中检查if (!$zeit_[1]) 和在其他案例中检查if ($zeit_[$i] =~ /D/) 似乎没有意义。在任何情况下,$zeit_[1]都不会在循环的第一次迭代中设置(其中$zeit_[$i]为0,因此$zeit_[1]将不会被赋予值)。

其他一些Perl技巧:

  • 如果你把它写成$i,那么$zeit_[1]就容易理解了。
  • 在子程序调用中不需要使用for ($i=0;$i<6;$i++)for my $i (0 .. 5)的工作方式与&一样(并且不会让非Perl程序员感到困惑)。
  • 如果您正在使用CGI.pm(并且调用error(...)暗示您是),那么您可以使用&error(...)来创建CGI标头。

更新:考虑到我们学到的一切,我会写得更像这样:

$q->param(...)

以上是关于Perl - 在for循环中验证参数的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始

如何在Django视图中使用for循环返回每次迭代[关闭]

c_cpp 这个简单的代码片段显示了如何使用有符号整数在C中完成插值。 for()循环确定要插入的范围

如何使用引导程序和 for 循环在 django 中创建电影片段?

如何在 Perl 脚本之间共享 ENV 变量

Perl:为啥在循环中声明(我的)变量会更慢?