【问题标题】:Scalar found where operator expected标量在操作员预期的地方找到
【发布时间】:2017-11-20 13:48:48
【问题描述】:

我不认为这是重复的,因为我一直在寻找具有相同标题的所有其他主题。所以,这是我的代码:

while ($n>0)
{
   if (($n%10)%2 eq 0)
   $k = $k+1;
   $n = $n/10;
}

我编写了一个程序来计算数字 n 中有多少个偶数 当我尝试运行我的程序时,会显示此错误:

Scalar found where operator expected at script.pl line 7, near ")
        $k"
        (Missing operator before $k?)
syntax error at script.pl line 7, near ")
        $k "

第 7 行将是:

$k = $k+1;

【问题讨论】:

  • 可能不相关,但 eq 应该是 == 用于比较非字符串值

标签: perl


【解决方案1】:

我猜你以前在编程语言方面有经验,如果 if 块只包含一个语句,则块标记是可选的。在 Perl 中,它们始终是必需的。

if (($n%10)%2 == 0) {
    $k = $k+1;
}
$n = $n/10;

我还将eq 更改为== - 因为看起来您是在比较数字,而不是字符串。

【讨论】:

    【解决方案2】:

    perldoc perlsyn:

    if (EXPR) BLOCK
    if (EXPR) BLOCK else BLOCK
    if (EXPR) BLOCK elsif (EXPR) BLOCK ...
    if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
    

    if 语句后面必须跟 ,而不是表达式。

    if (($n%10)%2 eq 0) {
        $k = $k+1;
    }
    $n = $n/10;
    

    您也可以使用if 作为语句修饰符:

    Any simple statement may optionally be followed by a SINGLE modifier, just
    before the terminating semicolon (or block ending). The possible modifiers
    are:
    
        if EXPR
    

    ...在这种情况下,您的代码将如下所示:

    $k = $k+1 if ($n%10)%2 eq 0;
    $n = $n/10;
    

    ……但是this usage is discouraged.


    另外:将数字与== 而非eq 进行比较。

    【讨论】:

      【解决方案3】:

      您正在使用 Perl 编写 Python 代码。这对于 Perl 代码来说要好得多!

      while ($n>0)
      {
         if (($n%10)%2 eq 0)
         $k = $k+1;
         $n = $n/10;
      }
      

      while 的大括号正确; if 需要同样的处理,像这样

      while ( $n > 0 ) {
      
          if ( ( $n % 10 ) % 2 eq 0 ) {
      
              $k = $k + 1;
              $n = $n / 10;
          }
      }
      

      但是 Perl 比 Python 有更多的运算符,所以我会写这个,注意 ( $n % 10 ) % 2$n % 2 相同,因为 2 是 10 的因数,你应该使用 == 而不是 eq数值相等

      while ( $n ) {
      
          next if $n % 2;
      
          ++$k;
          $n /= 10;
      }
      

      我认为你应该强制 $n 在两种语言中都是整数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        相关资源
        最近更新 更多