我没有得到这个代码在perl中的功能

时间:2014-11-12 10:17:52

标签: regex perl

以下代码在perl中的含义是什么:

foreach (@a) {

    if ( $_ =~ m/active/ ) {

        s/ *//g;
        s/\r//;
        my @v = split(/\-/);
        $_cfg{$v[0]} = $v[1];   # Begin loading hash
    }
}

3 个答案:

答案 0 :(得分:2)

以下是解释:

foreach (@a) {                  # loop on all elements of array @a
    if ( $_ =~ m/active/ ) {    # if current element contains 'active'
        s/ *//g;                # removes all spaces
        s/\r//;                 # remove carriage return
        my @v = split(/\-/);    # split on dash 
        $_cfg{$v[0]} = $v[1];   # populates the hash %_cfg where the key is 
                                # what there is before the first dash
                                # and value is what is between the first and the second dash
                                # or end of string
    }
}

如果数组@a包含例如:

my @a = (
    'active-true',
    'this is not  - active'
    'whatever',
);

然后哈希%_cfg将包含:

%_cfg =
(
    active => 'true',
    thisisnot => 'active',
);

答案 1 :(得分:1)

给定数组@a

  • 循环遍历每个元素,以查看它们是否将文本“活动”作为子字符串。
  • 如果是:
    • 删除所有空格
    • 删除所有\r换行符。
    • 创建一个本地数组@v,用于分割-字符上的(修改过的)行。
    • 在哈希%cfg中插入一个键值对,其中'key'是@v的第一个元素,值是第二个。

所以给出: fish-cab bage-42-moo-active

最终会: $_cfg{'fish'} = "cabbage";

perl -MO=Deparse可以帮助理解这一点。要理解的核心是$_ - 这是隐式变量。它为循环的每次迭代设置为当前值,并且是某些函数的默认操作。例如split或使用s/text/newtext/的模式替换。

答案 2 :(得分:1)

这里有解释: -

对于数组中的每个元素:a,如果匹配'有效': -

  1. 删除其中的所有空格。
  2. 删除返回字符:' \ r'在其中
  3. 然后,在该元素中留下的任何内容,将其拆分为' - '并将拆分的输出放在一个数组
  4. 然后,使用数组v
  5. 填充_cfg哈希表

    我认为a中的每个元素都是由'分隔的键值对 - '