Я бы сделал это так:
#!/usr/bin/perl
use strict;
use warnings;
my $str = "a>b>c>d>e>f>g";
my @words = split />/, $str;
$" = '';
my @new_words;
push @new_words, "@words[0 .. $_]" for 0 .. $#words;
print join '>', @new_words;
Несколько вещей, чтобы объяснить.
Perl расширит переменные массива в строке в двойных кавычках. Вот как то так:
@array = ('x', 'y', 'z');
print "@array";
напечатает x y z
. Обратите внимание, что между элементами есть пробелы. Строка, вставленная между элементами, контролируется переменной $"
. Поэтому, установив эту переменную в пустую строку, мы можем удалить пробелы, так:
$" = '';
@array = ('x', 'y', 'z');
print "@array";
напечатает xyz
.
Самая сложная строка:
push @new_words, "@words[0 .. $_]" for 0 .. $#words;
Это просто компактный способ написать:
for (0 .. $#words) {
my $new_word = "@words[0 .. $_]";
push @new_words, $new_word;
}
Мы перебираем целые числа от нуля до последнего индекса в @words
. Каждый раз в цикле мы используем фрагмент массива, чтобы получить список элементов из массива, преобразовать его в строку (поместив его в двойные кавычки), а затем вставить эту строку в @new_words
.