Der einfachste Weg ist es in einem Array zu setzen und es dann in Scheiben schneiden:
my $s = 'a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v';
my @arr1 = split /-/, $s;
my @arr2 = @arr1[[email protected]];
oder
my @arr = do { my @arr = split /-/, $s; @arr[[email protected]] };
oder
my @arr = map @$_[2..$#$_-5], [ split /-/, $s ];
alles auf einmal, ohne eine zu tun Extra Variable, Sie müssten eine beliebige Größe wählen, die größer ist als das Array wäre und zwei Scheiben machen:
my @arr = grep defined, (grep defined, (split /-/, $s)[2..999])[-999..-5];
(das ist viel weniger effizient als nur ein separates Array verwenden).
Erläuterung: Annahme s $ ist 'a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v'
:
Die erste Scheibe (2..999) wird eine Liste von 'c', 'd', 'e', ..., 't', 'a', 'v'
von 984 undef
Werten gefolgt produzieren, da die Scheibe für so viele Elemente verlangt, die nicht existieren . Die innere grep defined
entfernt diese undef
Werte, die 14 Element c
durch v
Liste verlassen.
Der zweite Slice (-999 ..- 5) erzeugt eine Liste beginnend mit 985 undef
Elementen (da die Indizes -999 bis -15 nicht existieren), gefolgt von 'c', 'd', 'e', ..., 'c', 'a', 'v'
. Die äußere grep defined
löscht diese undef
Werte und hinterlässt die gewünschte 10-Element-Liste.
Entschuldigung Ihre Frage ist überhaupt nicht klar. Bitte erläutern Sie genauer, welches Ergebnis Sie erzielen möchten. –
@JimGarrison Beitrag bearbeitet. – mkHun