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

时间:2013-04-17 17:01:06

标签: perl hash substr

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

我有这行脚本:

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

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

21 A10 A11 A12 A13 .. 

然后我尝试将这些值推送到名为“flowers”的哈希值

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已不在我的@flowers中。

感谢任何帮助。

5 个答案:

答案 0 :(得分:3)

这将对@dash数组的每个元素进行操作:

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

你的substr($dash, 0, 2)作为一个字符串在行上运行,而不是每个元素。

并且,除非您需要其他操作的索引:

push @flowers, @dash

这会将@dash的所有元素推送到@flowers。这看起来就像你在做什么。

答案 1 :(得分:1)

你需要某种循环,因为你想对第一个@dash以外的每个元素做一些事情。 map在这里很方便。

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

这是写作的简短方法

my @flowers;
for (1..$#dash) {
   push @flowers, substr($dash[$_], 1);
}

答案 2 :(得分:1)

为什么不在分割中更改正则表达式?

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

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

push( @flowers, split(/\s+\D?/, $dash) );

答案 3 :(得分:1)

我建议您从$dash中取出所有数字序列,如下所示:

my $dash = '21 A10 A11 A12 A13 .. ';

my @flowers = $dash =~ /\d+/g;
shift @flowers;

print "@flowers";

<强>输出

10 11 12 13

答案 4 :(得分:0)

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

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