1

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

我有这行脚本:

@dash = split /\s+/, $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都不再在 my @flowers.

任何帮助表示赞赏。

4

5 回答 5

3

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

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

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

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

push @flowers, @dash

这将推动 on 的所有@dash元素@flowers。这看起来像你在做什么。

于 2013-04-17T17:05:27.057 回答
1

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

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

这是写作的简短方式

my @flowers;
for (1..$#dash) {
   push @flowers, substr($dash[$_], 1);
}
于 2013-04-17T17:09:29.117 回答
1

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

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

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

push( @flowers, split(/\s+\D?/, $dash) );
于 2013-04-17T17:50:59.117 回答
1

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

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

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

print "@flowers";

输出

10 11 12 13
于 2013-04-17T19:20:06.273 回答
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
于 2013-04-17T17:48:10.390 回答