2016-08-22 6 views
1

Ich möchte den zweiten Index bis zum fünften Element vom letzten Index speichern, indem ich den Bereichsoperator spalte.Handle Range Operator mit positiven und negativen Bereich?

my $s = "a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v"; 
my @ar = (split "-",$s)[2..-5]; 
print @ar; 

Erwartete Ausgabe ist c-d-e-f-g-f-e-c-a-v

Wie wie unten I

a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v 
    |     |   
    2     | 
         -5 
    __________________ 
    How to store these element   
+1

Entschuldigung Ihre Frage ist überhaupt nicht klar. Bitte erläutern Sie genauer, welches Ergebnis Sie erzielen möchten. –

+0

@JimGarrison Beitrag bearbeitet. – mkHun

Antwort

3

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.

+0

Ich mag Ihre letzte Methode, aber ich kenne den letzten Index nicht. – mkHun

+0

@mkHun: Sie müssen nicht den letzten Index wissen, Sie müssen nur wissen, wie groß es jemals sein könnte. – ysth

+0

Warum haben Sie 'defined' in zwei Fällen verwendet? Sollen Sie es erklären? – mkHun

1

Sie speichern möchten, dass nicht direkt tun. 2..-5 ist eine leere Liste, da 2 größer als -5 ist.

Sie müßten einen Array verwenden:

my $s = "a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v"; 
my @ar = split /-/, $s; 
print join("-", @ar[2 .. $#ar-4]), "\n"; 

$#ar sind der letzte Index in @ar, die den Arbeitsbereich Berechnung macht.

Verwandte Themen