質問
最近、私は、"必要"zip機能Perl5が考えてい どんな計算に対す。すなわち機能かつリスト"zips"一緒に一つのリストでインターリーブ動作します。
(擬似)例:
@a=(1, 2, 3);
@b=('apple', 'orange', 'grape');
zip @a, @b; # (1, 'apple', 2, 'orange', 3, 'grape');
ウていzipのプレリュード や Perl6zipオペレーター 築すが、よろしくお願いしまでエレガントでPerl5?
解決
という二つのリストと同じ長さで、こちらのシングソリューションのためのmerlyn(ランダルタイ-シュワルツ氏)と呼んでいperversely perlish:
sub zip2 {
my $p = @_ / 2;
return @_[ map { $_, $_ + $p } 0 .. $p - 1 ];
}
ここでは10-要素リストが表示されますので、最初の、その回転軸の中、この場合5保存してください $p
.そのままインデックスへの組入れはそれまでは、この場合0 1 2 3 4.次を使用していま map
アペ各指標別指数との間の距離の回転ポイントとしての最初のインデックスが開始からのプレゼ(この場合において) 0 5 1 6 2 7 3 8 4 9.そして、スライスから @_
を使用しては、リストの指数。このように 'a', 'b', 'c', 1, 2, 3
渡され zip2
, れることリスト疾 'a', 1, 'b', 2, 'c', 3
.
この書き込みできる単一の表現に沿ってysthのラインはこのように:
sub zip2 { @_[map { $_, $_ + @_/2 } 0..(@_/2 - 1)] }
かんたいずれかをご利用の変化に依存するかどうかご自分の記憶をどのように仕事が、私にとって、心エキスパンダ.
他のヒント
の リスト::MoreUtils モジュールはzip/メッシュ機能なフレキシビリティ:
use List::MoreUtils qw(zip);
my @numbers = (1, 2, 3);
my @fruit = ('apple', 'orange', 'grape');
my @zipped = zip @numbers, @fruit;
こちらのソースであるメッシュ機能:
sub mesh (\@\@;\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@) {
my $max = -1;
$max < $#$_ && ($max = $#$_) for @_;
map { my $ix = $_; map $_->[$ix], @_; } 0..$max;
}
見以下のソリューションでも簡単に読み:
@a = (1, 2, 3);
@b = ('apple', 'orange', 'grape');
@zipped = map {($a[$_], $b[$_])} (0 .. $#a);
今までよりも速くソリューションを作成し配列間違った順序で初に利用し、スライスの双方向の内部状態を表示します、またはソリューションの変更 @a
や @b
.
配列と同じ長さ:
my @zipped = ( @a, @b )[ map { $_, $_ + @a } ( 0 .. $#a ) ];
my @l1 = qw/1 2 3/; my @l2 = qw/7 8 9/; my @out; push @out, shift @l1, shift @l2 while ( @l1 || @l2 );
場合のリストの長さが異なるが、このまま入れundef"のキャラクターにでも簡単に治療すればいないのではないかと思います。のようなもの(@l1[0]&&シフト@l1)に思います。
武器agiは、dexで下がらないboxerぐ!
これは完全なエレガントな解決方法ものの、想像を絶する。でも楽しい!
package zip;
sub TIEARRAY {
my ($class, @self) = @_;
bless \@self, $class;
}
sub FETCH {
my ($self, $index) = @_;
$self->[$index % @$self][$index / @$self];
}
sub STORE {
my ($self, $index, $value) = @_;
$self->[$index % @$self][$index / @$self] = $value;
}
sub FETCHSIZE {
my ($self) = @_;
my $size = 0;
@$_ > $size and $size = @$_ for @$self;
$size * @$self;
}
sub CLEAR {
my ($self) = @_;
@$_ = () for @$self;
}
package main;
my @a = qw(a b c d e f g);
my @b = 1 .. 7;
tie my @c, zip => \@a, \@b;
print "@c\n"; # ==> a 1 b 2 c 3 d 4 e 5 f 6 g 7
取り扱い方 STORESIZE
/PUSH
/POP
/SHIFT
/UNSHIFT
/SPLICE
運動のリーダー.