关于perl条件语句出错问题

关于perl条件语句出错问题,perl,Perl,我们使用Perl脚本来检查条件是否正确 ##code(t1) is as belows: my @results = (93, 4, 0); my @param_array = ( [ "50", "<", "stat1", ], [ "1", "<", "stat2", ], [ "3", "<&qu

我们使用Perl脚本来检查条件是否正确

##code(t1) is as belows:

my @results = (93, 4, 0);

my @param_array = (
    [ "50", "<", "stat1", ],
    [ "1", "<", "stat2", ],
    [ "3", "<", "stat3", ],
);

for ($i=0; $i < @results; $i++) {

  print (" " . $results[$i] . " " . $param_array[$i][1] . " " . $param_array[$i][0] . " ");

  if  ( $results[$i] + 0 < $param_array[i][0] + 0 ) {

    print "  beend";

  }
  else {
    print "  end111";

  }
}
您应该添加使用警告;您应该看到警告消息,如:

Unquoted string "i" may clash with future reserved word
Argument "i" isn't numeric in array element
你还应该加上使用严格;您应该看到编译错误消息,如:

Bareword "i" not allowed while "strict subs" in use 
你需要把i换成$i。更改:

if ( $results[$i] + 0 < $param_array[i][0] + 0 ) {
下面是一个整洁的代码版本,使用perltidy进行了适当的修复:

您应该添加使用警告;您应该看到警告消息,如:

Unquoted string "i" may clash with future reserved word
Argument "i" isn't numeric in array element
你还应该加上使用严格;您应该看到编译错误消息,如:

Bareword "i" not allowed while "strict subs" in use 
你需要把i换成$i。更改:

if ( $results[$i] + 0 < $param_array[i][0] + 0 ) {
下面是一个整洁的代码版本,使用perltidy进行了适当的修复:


这是您的原始程序:

my @results = (93, 4, 0);

my @param_array = (
    [ "50", "<", "stat1", ],
    [ "1", "<", "stat2", ],
    [ "3", "<", "stat3", ],
);

for ($i=0; $i < @results; $i++) {
  print (" " . $results[$i] . " " . $param_array[$i][1] . " " . $param_array[$i][0] . " ");
  if  ( $results[$i] + 0 < $param_array[i][0] + 0 ) {
    print "  beend";
  }
  else {
    print "  end111";
  }
}
但这看起来很像一个子程序,其中参数列表是真理的中心来源。我通常不喜欢从子例程输出,所以我返回一个可以从for循环输出的字符串。不过这没什么大不了的:

for( ... ) {
    say 
        compare_things( 
            $results[$i], 
            $param_array[$i][1], 
            $param_array[$i][0] 
            );
    }

sub compare_things {
    my( $left, $operation, $right ) = @_;

    my $string = " $left $operation $right   ";
    $string .= $left < $right ? 'beend' : 'end111';
    }
在更大的程序中,这些0和1索引可能会成为一个问题,特别是当您更改元素的数量或数据的顺序时。它们有时被称为魔法常数。您也可以给这些标签,以便应用程序中的所有内容都使用相同的值来表示相同的内容。Perl附带了常量pragma,但还有其他方法可以获得相同的效果:

use constant VALUE => 0;
use constant OPERATION => 1;

for( ... ) {
    my $left       = $results[$i];
    my $params_ref = $param_array[$i];
    my $operation  = $params_ref->[OPERATION];
    my $right      = $params_ref->[VALUE];

    print " $left $operation $right   ";
    say $left < $right ? 'beend' : 'end111';
    }
还有一件事我经常喜欢做,这暴露了我的数学和物理背景。我喜欢把相同的东西排成一行。如果他们是一样的,他们应该排队,如果他们不排队,我就做错了。而不是我已经排列好的=:

我可能倾向于越过第一行,这样同样的索引也会对齐:

    my $left       =     $results[$i];
    my $operation  = $param_array[$i][1];
    my $right      = $param_array[$i][0];
这种视觉线索通过突出事物的相似性向我展示了事物是如何相互联系和相似的。当我们看到这样的结构时,我们通常会看到更少的复杂性,因为并行结构将多个不相连的东西组合成一个易于理解的单一模式。我经常以这种方式捕捉bug,因为我看到在某些行中,我做了一些稍微不同的事情,比如错误地排列参数,省略参数,或者其他什么


但是,这就是风格问题,你周围的人可能会有不同的想法。其他人对事物的理解不同。盐的味道。

这是您的原始程序:

my @results = (93, 4, 0);

my @param_array = (
    [ "50", "<", "stat1", ],
    [ "1", "<", "stat2", ],
    [ "3", "<", "stat3", ],
);

for ($i=0; $i < @results; $i++) {
  print (" " . $results[$i] . " " . $param_array[$i][1] . " " . $param_array[$i][0] . " ");
  if  ( $results[$i] + 0 < $param_array[i][0] + 0 ) {
    print "  beend";
  }
  else {
    print "  end111";
  }
}
但这看起来很像一个子程序,其中参数列表是真理的中心来源。我通常不喜欢从子例程输出,所以我返回一个可以从for循环输出的字符串。不过这没什么大不了的:

for( ... ) {
    say 
        compare_things( 
            $results[$i], 
            $param_array[$i][1], 
            $param_array[$i][0] 
            );
    }

sub compare_things {
    my( $left, $operation, $right ) = @_;

    my $string = " $left $operation $right   ";
    $string .= $left < $right ? 'beend' : 'end111';
    }
在更大的程序中,这些0和1索引可能会成为一个问题,特别是当您更改元素的数量或数据的顺序时。它们有时被称为魔法常数。您也可以给这些标签,以便应用程序中的所有内容都使用相同的值来表示相同的内容。Perl附带了常量pragma,但还有其他方法可以获得相同的效果:

use constant VALUE => 0;
use constant OPERATION => 1;

for( ... ) {
    my $left       = $results[$i];
    my $params_ref = $param_array[$i];
    my $operation  = $params_ref->[OPERATION];
    my $right      = $params_ref->[VALUE];

    print " $left $operation $right   ";
    say $left < $right ? 'beend' : 'end111';
    }
还有一件事我经常喜欢做,这暴露了我的数学和物理背景。我喜欢把相同的东西排成一行。如果他们是一样的,他们应该排队,如果他们不排队,我就做错了。而不是我已经排列好的=:

我可能倾向于越过第一行,这样同样的索引也会对齐:

    my $left       =     $results[$i];
    my $operation  = $param_array[$i][1];
    my $right      = $param_array[$i][0];
这种视觉线索通过突出事物的相似性向我展示了事物是如何相互联系和相似的。当我们看到这样的结构时,我们通常会看到更少的复杂性,因为并行结构将多个不相连的东西组合成一个易于理解的单一模式。我经常以这种方式捕捉bug,因为我看到在某些行中,我做了一些稍微不同的事情,比如错误地排列参数,省略参数,或者其他什么


但是,这就是风格问题,你周围的人可能会有不同的想法。其他人对事物的理解不同。盐的味道。

如果不知道您正在处理的数据,我们无法帮助您。请在您的问题中加入适当的示例输入。请同时格式化您的代码。这很难读。粗略地看了一眼,我已经可以告诉你,那里有一些安全漏洞,你应该修复。谢谢simbabque,我已经修改了代码,更改为reprudce示例,请检查一下,谢谢!我已经修复了代码的缩进,并添加了一些空白。当然欢迎你,但请考虑以后自己做。仔细的缩进是帮助人们理解你的代码的强大工具,如果你要求一大群陌生人阅读和理解你的代码,那么礼貌的做法是让他们尽可能简单。如果不知道你正在处理的数据,我们无法帮助你。请在您的问题中加入适当的inp示例
美国犹他州。请同时格式化您的代码。这很难读。粗略地看了一眼,我已经可以告诉你,那里有一些安全漏洞,你应该修复。谢谢simbabque,我已经修改了代码,更改为reprudce示例,请检查一下,谢谢!我已经修复了代码的缩进,并添加了一些空白。当然欢迎你,但请考虑以后自己做。仔细的缩进是一个强大的工具,可以帮助人们理解你的代码。如果你要求一大群陌生人阅读和理解你的代码,那么礼貌的做法是让他们尽可能容易理解。
use v5.12;
while( my( $i, $left ) = each @results ) {
    my $operation  = $param_array[$i][1];
    my $right      = $param_array[$i][0];

    print " $left $operation $right   ";
    say $left < $right ? 'beend' : 'end111';
    }
    my $left       = $results[$i];
    my $operation  = $param_array[$i][1];
    my $right      = $param_array[$i][0];
    my $left       =     $results[$i];
    my $operation  = $param_array[$i][1];
    my $right      = $param_array[$i][0];