代码之家  ›  专栏  ›  技术社区  ›  Yacob

删除Perl中数组元素的第一个字符

  •  1
  • Yacob  · 技术社区  · 13 年前

    我想删除Perl脚本中数组元素中的第一个字符。

    我有这行脚本:

    @dash = split /\s+/, $dash;
    

    变量“dash”是从我的文件的特定行读取的:示例

    21 A10 A11 A12 A13 .. 
    

    然后我尝试将这些值推送到我的散列中,称为“花”

    for $i (1..$#dash) {
        push(@flowers, $line[$i]);
    }
    

    这似乎适用于我后续脚本行中所需的内容,但我发现 $dash 在每个值前面包含不需要的字符:

    A10 A11 A12 A13 ..
    

    而不是

    10 11 12 13 .....
    

    但我想要 @flowers 包含:

    10 11 12 13 ....
    

    如何删除第一个字符 之前 我把它推到我的哈希(@flowers)

    chop(@flowers); 
    

    本可以奏效,但它只删掉了最后一个字符。当我尝试使用

    substr($dash, 0, 2)
    

    它确实产生 10 ,但所有其他值 A11 A12 A13 不再在我的 @花朵 .

    任何帮助都将不胜感激。

    5 回复  |  直到 13 年前
        1
  •  3
  •   kjprice    13 年前

    这将对 @dash 阵列:

    @dash = split /\s+/, $dash;
    shift @dash;
    @dash = map { substr($_, 1) } @dash;
    

    你的 substr($dash, 0, 2) 是作为一个字符串对行进行操作的,而不是其中的每个元素。

    而且,除非您需要索引进行其他操作:

    push @flowers, @dash
    

    这将推动 @仪表板 向 @flowers 。看起来像你在做什么。

        2
  •  1
  •   William    13 年前

    为什么不直接更改拆分中的正则表达式?

    split /\s+\D?/, $dash;
    

    如果你愿意,可以通过这种方式将它们添加到@flowers中:

    push( @flowers, split(/\s+\D?/, $dash) );
    
        3
  •  1
  •   ikegami Gilles Quénot    13 年前

    你需要某种循环,因为你想对 @dash 除了第一个。 map 在这里很方便。

    my @flowers = map substr($dash[$_], 1), 1..$#dash;
    

    哪种书写方式比较短

    my @flowers;
    for (1..$#dash) {
       push @flowers, substr($dash[$_], 1);
    }
    
        4
  •  1
  •   Borodin    13 年前

    我建议你把所有的数字序列都从 $dash ,如下所示:

    my $dash = '21 A10 A11 A12 A13 .. ';
    
    my @flowers = $dash =~ /\d+/g;
    shift @flowers;
    
    print "@flowers";
    

    输出

    10 11 12 13
    
        5
  •  0
  •   Miguel Prz    13 年前

    这是一个可能的解决方案:

    use strict;
    use warnings;
    
    my $dash = "21 A10 A11 A12 A13"; #test data
    my @dash = split /\s+/, $dash; #split into @dash array
    shift @dash; #delete first array value
    $_ = substr($_,1) for @dash; #for each item in array, remove the first character
    print "@dash\n"; #prints: 10 11 12 13