質問

ただし配列の短縮Perl?みんな待っているんだから"とウェブページを表示できたらいいのに割り当て:

$#ARRAY = 42;

この使用は$#は推奨されていません。いうソリューション事業部の配列の配列です。この動作しなかった:

$#$ARRAY[$i] = 42;
役に立ちましたか?

解決

思い付 $#ARRAY って推奨されていません; perldoc perldata から5.10.0もう何もしてくれない。すべて揃っており、少ない手間と短めに切り詰めます。

したい場合にも、読みやすくするために使用 splice:

splice @ARRAY, 43;

(注 43 の代わりに 42 - $#ARRAY 新しくできた最後のインデックスの配列は splice taksの 長さ 配列の代わりに).

として働くに配列した配列の場合は、い意味で切り詰めに入れ子配列を介。その場合、たい:

$#{$ARRAY->[7]} = 42;

または

splice @{$ARRAY->[7]}, 43;

他のヒント

オプションの近くに無限(かげつの手法がここで戦略惑どお客様の特定のニーズや目標です。(例するためには、@の配列により変更する場合があ$N要素)


[編集]

いるその他の指摘の通り、の方法では、元の問題あるいは推奨されていません、この最速、tersestが、必ずしも最も読ます。 でも効果の拡大の配列が$$N$個の整数が空の要素:

$#array = $N-1;

少なくともコード:

#best for trimming down large arrays into small arrays
@array = $array[0..($N-1)];

最も効率的なトリミング用の小さな番号の大きな配列:

#This is a little less expensive and clearer
splice(@array, $n, @#array);

望ましくないケースがほとんどしないかぎり、こよなく愛する削除():

#this is the worst solution yet because it requires resizing after the delete
while($N-1 < $#array)
{
   delete(array[$i]);
}

が必要な場合などにお役にたち、残りのリストを逆順:

#this is better than deleting because there is no resize
while($N-1 < $#array)
{
    pop @array;
    #or, "push $array2, pop @array;" for the reverse order remainder
}

有機長:

#don't put more values into the array than you actually want

$# 変数は推奨されていませんが、 $#array 特徴はないです。

の利用 $#array 書式は任意の表現と利回りの配列の参照、 $#{ EXPR }.

のオンラインアクションに参加する http://perlmonks.org/?node=References+quick+reference

す基本的には標準的な答えます。縮配列を設定最後のインデックス:

$#Array = 42

の$#Foo表記とを示す最後のインデックスの配列が絶対 ない 推奨されていません。同様に、定できません推奨されていません。引用のperldataドキュメンテーション

その長さ配列はスカラー値です。 が入っている場合もあり長さ 配列@のように評価す$#日, は、csh.しかし、このできないのではないで 長さの配列;ので、下付き文字の最後の要素である 異なる価値があるので通常は0番目の要素になります。 配 $#日変更の長さの配列になります。 短縮配列 このように破壊に介入す。長期配列した 従来の短縮回復されない価値あった者 ます。で使うPerl4、私たち破ることに 確destructorsたときに呼び出されます。)

  • $#の配列 最後のindex の配列になります。
  • $#$配列 最後のインデックスの配列 指摘を ドル配列になります。
  • $#$配列[$i]というインデックスは、スカラ--できません。$#{$配列[3]}適切に解決したsubscriptingの配列の前にした参照最後のインデックス.
  • 単独で使用

    $#{$配列[3]}=9;

    員長は9、 autovivified 配列$配列た[3]。

  • 疑問がある場合には、利用データ::ダンパー:

    use Data::Dumper;
    $#{$array[3]} = 5;
    $#array       = 10;
    print Dumper( \@array, $array ), "\n";
    

$#{$配列[$i]}=42;

なにができる

splice @array, $length;
#or
splice @{$arrays[$i]}, $length;

方法が二つありますので通訳の問題をもたらしていました。

  • ほかの長さの配列?
  • いかに削減のメモリ消費の配列?

の答えをこれまで注力しました。私の答えである スプライス 機能です。例えば、去10の要素の終了:

splice @array, -10;

しかし、どのようPerlの管理メモリアレイのみに適合することを確保するための配列はメモリにコピーして新しい配列(せをメモリに配列する埋め立て).このためにはいい"と思われているようです。を利用す スライス 動作します。E.g.) 除去10要素

@new = @old[ 0 .. $#old - 10 ]

こちらは比較の異なるアプローチの500要素配列を用2104バイト):

  original: length  500 => size 2104
     pound: length  490 => size 2208
    splice: length  490 => size 2104
    delete: length  490 => size 2104
     slice: length  490 => size 2064

できるだけのスライス操作(コピーされる新しい配列が小さい サイズ 以上のオリジナルです。

こちらのコードを使用したこの解析:

use strict;
use warnings;
use 5.010;
use Devel::Size qw/size/;

my @original = (1 .. 500);
show( 'original', \@original );

my @pound = @original;
$#pound = $#pound - 10;
show( 'pound', \@pound );

my @splice = @original;
splice(@splice,-10);
show( 'splice', \@splice);

my @delete = @original;
delete @delete[ -10 .. -1 ];
show( 'delete', \@delete );

my @slice = @original[0 .. $#original - 10];
show( 'slice', \@slice);

sub show {
    my ($name, $ref) = @_;
    printf( "%10s: length %4d => size %d\n", $name, scalar @$ref, size($ref));
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top