为哈希中的 * 字符赋值



使用以下代码部分,我通常会拆分一个混合字符串-整数字段(例如 45A34C),并根据存储在 %r 中的一组规则统计每个字母的实例(由执行它的整数指定)。这工作正常。

use strict;
use warnings;
my @F; $F[5] = '*';
my @ar = split(/([ABCD])/, $F[5]);
my %r = (A => 1, B => 1, C => 0, D => 1, '*' => 0);
my $s = 0;
my $op;
my $n;
$s += $n * $r{$op} while ($n,$op) = splice @ar,0,4;

但是,在某些情况下,$F[5]只包含一个星号 - 一个字面*字符。任何包含此内容的行都会返回以下警告:

Use of uninitialized value $op in hash element at b.pl line 10.
Use of uninitialized value in multiplication (*) at b.pl line 10.
Argument "*" isn't numeric in multiplication (*) at b.pl line 10.

鉴于*没有分配编号,这是意料之中的。我试图在哈希中为字符分配一个数字,但无法找出正确的语法。我试过:

my %r = (A => 1,B => 1,C => 0,D => 1, * => 0);
my %r = (A => 1,B => 1,C => 0,D => 1, * => 0);

但警告仍然存在。为特殊字符赋值的正确方法是什么,为什么不能像"A"那样处理*?

my %r = (A => 1, B => 1, C => 0, D => 1, '*' => 0);

当它是标识符时,=>"自动引号"其LHS,但它不必是标识符;它可以是任何表达式。(事实上,你甚至不需要使用=>,这只是一个花哨的逗号(,)。


但这并不能解决您的问题。 @ar只包含*,所以$n*的,$op是未定义的。 @ar至少需要有两个值才能使该代码正常工作。因此,让我们明确地寻找有意义的值。

my %r = (A => 1, B => 1, C => 0, D => 1 );
my $s = 0;
while ($F[5] =~ /(d+)([ABCD])/g) {
   my $n  = $1;
   my $op = $2;
   $s += $n * $r{$op};
}

顺便一提

* => 0是一种奇怪的*= > 0写法,意思是"球*=数值大于零"。

* => 0是一种奇怪的*= > 0写法,意思是"glob的地址在数值上*=大于零"。

最新更新