範囲演算子を使用して分割から最後のインデックスから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
範囲演算子を使用して分割から最後のインデックスから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
最も簡単な方法は、配列に入れて、それをスライスすることです:
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要素c
〜v
のリストを残します。
2番目のスライス(-999 ..- 5)は、985 undef
で始まるリストを生成します(インデックスは-999〜-15が存在しないため、'c', 'd', 'e', ..., 'c', 'a', 'v'
が続きます)。外側のgrep defined
は、それらのundef
の値を削除し、所望の10個の要素リストを残す。
を保存したいと
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
で最後のインデックスです。
ご迷惑をおかけして申し訳ございません。より具体的に説明し、達成したい結果を示してください。 –
@ジムガリソンポスト編集中。 – mkHun