プロが教える店舗&オフィスのセキュリティ対策術

perlを勉強し始めたのですが、
今 非共通要素の抜き出しに苦心しています。
助けていただければうれしいです。

以下は私が試したものなのですが
どうも非共通要素を抜き出せないでいます。
何故なのでしょうか?

@array = (1..10);
@cmp_array = (5..10);

@notfound=();

foreach $array_element (@array) {
foreach $cmp_array_element (@array) {
if ($array_element != $cmp_array_element) {
push @notfound, $array_element;
}
}
};

よろしくお願いします。

A 回答 (4件)

@array = (1..10);


@cmp_array = (5..10);
@notfound=();#@array だけにある要素
#1つのやり方
@ck{@cmp_array}=();
foreach $array_element (@array) {
push(@notfound, $array_element) unless exists $ck{$array_element};
}
print join(",",@notfound);#結果の表示

この回答への補足

全ての数が表示されてしまいました。

補足日時:2006/09/19 01:52
    • good
    • 0

#1>全ての数が表示されてしまいました。


ウチでは、
1,2,3,4
になりますけど・
    • good
    • 0
この回答へのお礼

すいません。
非共通要素を探す前に
共通要素を調べていた為かうまく表示がされなかっただけのようです。よく確かめずにコメントしてしまい、すみませんでした。
今はきちんと表示されています。ご回答 ありがとうございました。

お礼日時:2006/09/19 04:35

2つめの foreach の配列名が、間違っていますよ。

@array ではなく @cmp_array でしょう。

次の部分には、問題があります。

if ($array_element != $cmp_array_element) {
push @notfound, $array_element;
}

上のようにしてしまうと、@cmp_array の1つの要素と違うたびに $array_element を @notfound に入れてしまうことになります。非共通要素を抜き出すためには、@cmp_array のすべての要素と比較して、同じものがないときだけ @notfound に入れるようにしなければいけません。元のコードを生かして、直してみましたので参考にしてください。

OUT: foreach $array_element (@array) {
foreach $cmp_array_element (@cmp_array) {
next OUT if $array_element == $cmp_array_element;
}
push @notfound, $array_element;
}

この回答への補足

2行目はタイプミスしました。すいません。
これもうまく働きません。

共通要素がある時に保存するようになっています。
if文がどうも違っているようです。

$array_element == $cmp_array_element;

$array_element != $cmp_array_element;
と直して使ってみましたが 
arrayに含まれる全ての数字が表示されてしまいます。

補足日時:2006/09/19 01:58
    • good
    • 0

まあ #1 と同じですが


%ck = ();
$ck{$_} = 1 for @array;
$ck{$_} = 0 for @cmp_array;
@notfound = grep { $ck{$_} == 1 } keys %ck;
とか. delete を使うともっとシンプルかもしれない.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!