Sie können negative Bereiche im Array Subscript verwenden, um eine beliebige Anzahl von Elementen vom Ende her anzusprechen:
my $x = join ' ' => 'a' .. 'z';
my @x = (split ' ', $x)[-13 .. -1];
Dazu müssen Sie jedoch die Gesamtzahl der Elemente im Ergebnis von split
um nur das erste Element zu eliminieren.
Tritt dies nur an einer Stelle auf, können Sie mit einem do
Block sollte funktionieren:
my $x = join ' ', 'a' .. 'z';
my @x = do { my @y = (split ' ', $x); @y[1 .. $#y] };
In Ihrem Fall würde ich die gesamte Operation in ein Unterprogramm auslagern, wenn sie häufig verwendet werden soll, und die Zeichenfolge anstelle des Ergebnisses der split
an das Unterprogramm (kann weiter verallgemeinert werden, indem man dem Benutzer erlaubt, auch das Aufteilungsmuster zu übergeben:
my $x = join ' ', 'a' .. 'g';
my @x = skip_first_n_from_split(3, $x);
print Dump \@x;
sub skip_first_n_from_split {
my ($n, $x) = @_;
my @y = split ' ', $x;
return @y[$n .. $#y];
}
Spaß haben:
#!/usr/bin/perl
use strict; use warnings;
my $x = join ' ', 1 .. 8;
my @skippers = map make_skipper(' ', $_), 0 .. 7;
print "@$_\n" for map $_->($x), @skippers;
sub make_skipper {
my ($pattern, $n) = @_;
return sub {
my $string = shift;
my $i = 0;
return [ grep $i++ >= $n, split $pattern, $string ];
}
}
Ausgabe:
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8
3 4 5 6 7 8
4 5 6 7 8
5 6 7 8
6 7 8
7 8
8