Wenn ich nur den 4. extrahieren möchten, 5. und 7. Elemente (sagen wir) von Tab-getrennte Aufzeichnung, kann ich so etwas wie:Wie spezifiziert man eine "Schwanzscheibe" in Perl?
my @f = (split(/\t/, $_, -1))[3, 4, 6];
Aber was, wenn ich das vierte Element und das „Schwanz wollen Slice "bestehend aus allen Elementen vom 7. bis zum Ende des Arrays? Ich weiß nicht, wie ich das in einer einzigen Zeile machen soll. Das Beste, was ich tun kann, ist dies:
my @f = split(/\t/, $_, -1);
@f = @f[3, 6..$#f];
Der einzige Grund, dies zu tun Betrieb in zwei Linien ist so, dass ich $#f
in der zweiten Zeile angeben kann, aber dies erfordert ein höheres Maß an Spezifität als in der inhärent ist Aufgabe; die Aufgabe nicht wirklich Pflege wie viele Elemente sind in dem Wert von split
zurückgegeben. Es wäre schön, in der Lage zu sein, etwas wie "alles ab dem 7. Element verfügbar" zu spezifizieren ... Das ist was ich mit einem "Schwanzstück" meine: ein Stück, wo nur der Startpunkt angegeben wird, während der Endpunkt wird implizit gelassen.
(Diese Art der Spezifikation ist in Verwendungen des cut
Dienstprogramm in Unix alltäglich, zB:
... | cut -f 4,7-
)
Gibt es eine Subskribierung Ausdruck, dass ich direkt an die
(split(...))
subexpression bewerben in einer Zeile den gleichen Effekt zu erzielen, wie er durch die letzten beiden obigen Codezeilen erreicht wird?
EDIT: Um klar zu sein, was ich versuche zu vermeiden, ist die $#ARRAY
Konstruktion. Ich weiß, dass ich immer so etwas wie
my @f = do { my @t = split(/\t/, $_, -1); @t[3, 6..$#t] };
erweiterte meine Antwort. – ikegami
sehr cooler Gedanke –
Niiiiiice. Ich mag die Verwendung von '@ _', um einige temporäre Kopien dort zu vermeiden. – LeoNerd