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

时间:2018-03-03 10:56:19

标签: perl for-loop

脚本捕获5x2输入字段。

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!');} 在所有情况下都会发生。空输入,并且还填充了一个或所有五个输入。

当我对验证进行否定时

error

$zeit_[1]也会发生。我认为问题在于变量#

当我使用for ($i=0;$i<6;$i++)禁用验证时 - 脚本运行正常。输出显示所有10个元素。

可能有人给我一个提示吗?

此更新修复了问题

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\n\n"; print $ausgabe; exit(); 。正确的代码:

#include <iomanip>
#include <iostream>

#include <unicode/uchar.h>

#include <tao/pegtl.hpp>

using namespace tao::TAO_PEGTL_NAMESPACE;  // NOLINT

namespace test
{
   template< UProperty P >
   struct icu_has_binary_property
   {
      using analyze_t = analysis::generic< analysis::rule_type::ANY >;

      template< typename Input >
      static bool match( Input& in )
      {
         // this assumes the input is UTF8, adapt as necessary
         const auto r = internal::peek_utf8::peek( in );
         // if a code point is available, the size is >0
         if( r.size != 0 ) {
            // check the property
            if( u_hasBinaryProperty( r.data, P ) ) {
               // if it matches, consume the character
               in.bump( r.size );
               return true;
            }
         }
         return false;
      }
   };

   using icu_lower = icu_has_binary_property< UCHAR_LOWERCASE >;
   using icu_upper = icu_has_binary_property< UCHAR_UPPERCASE >;

   // clang-format off
   struct grammar : seq< icu_upper, plus< icu_lower >, eof > {};
   // clang-format on
}

int main( int argc, char** argv )
{
   for( int i = 1; i < argc; ++i ) {
      argv_input<> in( argv, i );
      std::cout << argv[ i ] << " matches: " << std::boolalpha << parse< test::grammar >( in ) << std::endl;
   }
}

1 个答案:

答案 0 :(得分:2)

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

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

在验证中,您有:

if (!$zeit_[1]) 

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

if ($zeit_[$i] =~ /\D/) 

在一个案例中检查$zeit_[1]而在其他案例中检查$zeit_[$i]似乎没有意义。在任何情况下,$zeit_[1]都不会在循环的第一次迭代中设置(其中$i为0,因此$zeit_[1]将不会给出值。)< / p>

其他一些Perl提示:

    如果您将其写为for ($i=0;$i<6;$i++)
  • for my $i (0 .. 5)会更容易理解。
  • 无需在子程序调用中使用&error(...)&error(...)一样有效(并且不会让非Perl程序员感到困惑)。
  • 如果你正在使用CGI.pm(以及对$q->param(...)的调用暗示你是),那么你可以使用$q->header(...)来创建CGI标题。

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

for my $i (0 .. 5) {

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

  ##validation

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

  if ($zeit_[$i] =~ /\D/) {
    # Interpolate variables in double-quoted strings
    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 $q->header;
print $ausgabe;
exit();