Удалить первый символ элементов массива в Perl

Я хотел бы удалить первый символ из элементов массива в сценарии Perl.

У меня есть эта строка сценария:

@dash = split /\s+/, $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 больше не входят в мой @flowers.

Любая помощь приветствуется.


person Yacob    schedule 17.04.2013    source источник


Ответы (5)


Почему бы просто не изменить регулярное выражение в расколе?

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

Добавьте их в @flowers таким образом, если хотите:

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

Это будет работать с каждым элементом массива @dash:

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

Ваш substr($dash, 0, 2) работал с строкой как с одной строкой, а не с каждым ее элементом.

И, если вам не нужен индекс для какой-либо другой операции:

push @flowers, @dash

Это переместит все элементы @dash в @flowers. Что похоже на то, что вы делаете.

person kjprice    schedule 17.04.2013
comment
@ikegami исправлено, я думаю, я не уверен, что именно здесь описывается. 21 это номер строки? Всегда ли это будет А или А-Я? - person kjprice; 17.04.2013

Вам нужен какой-то цикл, так как вы хотите что-то сделать с каждым элементом @dash, кроме первого. map здесь удобно.

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

это краткий способ написания

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

Я предлагаю вам просто вытащить все последовательности цифр из $dash, например:

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

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

print "@flowers";

вывод

10 11 12 13
person Borodin    schedule 17.04.2013

Это возможное решение:

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
person Miguel Prz    schedule 17.04.2013