2011-12-22 10 views
2

私はPerlでのプログラミングだ、と私は、このような@contentsとして、私は、このような@contents=(A,S,D,F,M,E)として配列を持っていると私は2つの新しい要素XY持つ要素Mを交換したいような状況にいるよ(A,S,D,F,X,Y,E)に等しくなります。配列の要素をその値に基づいて置き換えることはできますか?要素番号ではなく配列の2つの新しい要素を置き換える方法はありますか?

+0

「M」の出現をすべて置き換えたいのですか、最初のものだけを置き換えたいのですか、または1つしかないと仮定するのに満足できますか? –

+0

@Woodyあなたがあなたの質問に答えたと思ったら、その左側のチェックマークをクリックして答えの一つを受け入れることを検討してください。 – TLP

答えて

10

mapを使用できます。

@contents = map { $_ eq 'M' ? ('X','Y') : $_ } @contents; 

それとも、spliceを使用することができます。

for (0 .. $#contents) { 
    if ($contents[$_] eq 'M') { 
     splice @contents, $_, 1, 'X', 'Y'; 
    } 
} 

あなたはperlのバージョン5.12およびアップを使用している場合にも、インデックスのリストとしてkeys @contentsを使用することにより、さらに簡素化することができます。

+0

'keys @ contents'は5.12以降のPerlでのみ動作するという注意を追加する必要があります。 –

+0

@BradGilbert追加されました。とてもシンプルに見える便利な機能の多くには、これらのばかげたメモが必要です。 – TLP

+0

それはまだそれほど新しいので、それだけです。 [5.6](http://perldoc.perl.org/perl56delta.html)に追加されたものがありました。 ['our'](http://perldoc.perl.org/perl56delta.html#%22our%22-declarations)、[3 arg' open'](http://perldoc.perl.org/perl56delta.html)のように#open() - 2つ以上の引数付き)、['binmode fh、 ':crlf''](http://perldoc.perl.org/perl56delta.html#binmode()-can-be) %3acrlf-and-%3araw-modes)を使用します。 –

2

あなたが探しているコマンドはspliceです。

#!/usr/bin/perl -wT 
use strict; 

my @contents = qw(A S D F M E); 
my $match = 'M'; 
my @replace = qw(X Y); 
my $arrlen = @contents; 

for (my $i = 0; $i < $arrlen; $i++) 
{ 
    if ($contents[$i] eq $match) 
    { 
     splice (@contents, $i, 1, @replace); 
     last; 
    } 
} 

print "$_\n" foreach (@contents); 
+1

いくつかのヒント: 'use warnings'は、レキシカルスコープが可能なので、推奨プラグマです。ループにはperlスタイルを使用します(例: 'my $ arrlen = $#contents; Cスタイルforループの代わりに私の$ i(0 .. $ arrlen)... 'のために。なぜ汚れチェックをしていますか? 'last'を使うとマッチの最初のオカレンスだけを置き換えます。 [say](http://perldoc.perl.org/functions/say.html)を調べることに興味があるかもしれません。 'say for @ contents'はかなり良く見えます。ただし、厳密と警告の両方を使用する場合は+1してください。 – TLP

+0

私のコードを見ていただきありがとうございます。私の意図は、Perlに慣れていない人から聞いた最も一般的な苦情は、あいまいな構文なので、コードを読みやすく、perlに慣れていない人のために消化しやすくすることでした。 Potatoe、potatoe、そう思います。私は元の投稿のサンプルコードが2回以上一致する必要があることを示していないので(元の配列の1 'M'のみ)、ループから脱出するために 'last'を使用しています。そうでない場合は、「最後」の文を削除することをお勧めします。 –

+1

あなたがそれを知らないのはあいまいです。私は自分の英語を読むことができるより多くの人々のperlをよく読むことができることを知ります。 =) – TLP

関連する問題