Landscape トップページ | < 前の日 2004-02-29 2004-03-01 次の日 2004-03-04 >


* 一方のファイルにのみ存在する行を見つける

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

A のファイルには存在するが、B のファイルには存在しない行を見つける。ただし、「A のファイルには存在するが、B のファイルには存在しない行」を見つけることはできるが、「B には存在するが、A には存在しない」という行は検出できないので注意。まあ逆にしてもう一回やれば良いんだけど。

ただ単に配列がファイルになっただけ。確か同じことをやってくれるコマンドがあったような気もするけど、見つけられなかったので書いた。エラー処理とかは考慮してない。

- コード

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

my $part_file = $ARGV[0];
my $all_file = $ARGV[1];

open(PART, $part_file);
my @part = <PART>;
close(PART);

open(ALL, $all_file);
my @all = <ALL>;
close(ALL);

my %seen;
my @part_only;
@seen{@all} = ();

foreach my $item (@part) {
    push(@part_only, $item) unless exists $seen{$item};
    $seen{$item} = 1;
}

print @part_only;

printf("all: %d items\n", scalar(@all));
printf("part: %d items\n", scalar(@part));
printf("%d items only exists on %s\n", scalar(@part_only), $part_file);


* Perl クックブック初版第1刷 P106の間違い

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl] []

オライリーの Perl クックブック初版第1刷 の 106ページに間違いがある。ちなみに和訳版の話。

4章 配列 レシピ4.7 「一方の配列にはあって他方の配列にはない要素を見つける」の解説で、
以下のようなコードが出てくるが、unless exists でないと正しく動かない。

- 間違ったコード

foreach $item (@A) {
    push (@aonly, $item) unless $seen{$item};
    $seen{$item} = 1;    # 一回出現した要素をマーキングしておく
}

- 正しいコード

foreach $item (@A) {
    push (@aonly, $item) unless exists $seen{$item};
    $seen{$item} = 1;     # 一回出現した要素をマーキングしておく
}

- サンプルコード

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

my @A = qw(a b c d e);
my @B = qw(b c e);

my %seen;
my @aonly;

@seen{@B} = ();

foreach my $item (@A) {
        push (@aonly, $item) unless exists $seen{$item};
        $seen{$item} = 1;        # 一回出現した要素をマーキングしておく
}

print join("\n", @aonly);

サンプルコードを array_diff.pl として保存して実行した結果。
$ perl -wl array_diff.pl
a
d

Perlクックブック―Perlの鉄人が贈るレシピ集Perlクックブック―Perlの鉄人が贈るレシピ集

トム クリスチャンセン / ネイザン トーキントン / 田和 勝
発売日: 2001/03/23


amazon で詳しく見る   bk1で詳しく見る
すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。