2016-08-22 5 views
1

範囲演算子を使用して分割から最後のインデックスから5番目の要素を2番目の要素に格納します。以下のように私はあなたが直接それを行うことはできません正負の範囲のハンドル範囲演算子?

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

ご迷惑をおかけして申し訳ございません。より具体的に説明し、達成したい結果を示してください。 –

+0

@ジムガリソンポスト編集中。 – mkHun

答えて

3

最も簡単な方法は、配列に入れて、それをスライスすることです:

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]]; 

または

my @arr = do { my @arr = split /-/, $s; @arr[[email protected]] }; 

または

my @arr = map @$_[2..$#$_-5], [ split /-/, $s ]; 

ANせずに、一度にすべてを行うには余分な変数は、配列よりも大きい任意のサイズを選択し、2つのスライスを行う必要があります:

my @arr = grep defined, (grep defined, (split /-/, $s)[2..999])[-999..-5]; 

(これは、別個のアレイを使用するよりはるかに効率が低い)である。

説明:想定$ sは'a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v'ある:

スライスが存在しない多くの要素を要求するので、最初のスライス(2..999)は、984のundef値が続く'c', 'd', 'e', ..., 't', 'a', 'v'のリストを生成します。内部grep definedは、の値を削除し、14要素cvのリストを残します。

2番目のスライス(-999 ..- 5)は、985 undefで始まるリストを生成します(インデックスは-999〜-15が存在しないため、'c', 'd', 'e', ..., 'c', 'a', 'v'が続きます)。外側のgrep definedは、それらのundefの値を削除し、所望の10個の要素リストを残す。

+0

あなたの最後の方法が好きですが、最後のインデックスはわかりません。 – mkHun

+0

@mkHun:あなたは最後のインデックスを知る必要はありません。 – ysth

+0

なぜ2回に 'defined'を使いましたか?あなたはそれを説明するか? – mkHun

1

を保存したいと

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; 

の予想される出力はc-d-e-f-g-f-e-c-a-v

です。 2-5より大きいため、2..-5は空のリストです。

あなたは、配列を使用する必要があるだろう:

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は、範囲の計算作業を行い@arで最後のインデックスです。