古い記事
ランダムジャンプ
新しい記事
プログラミングメモ。
あとでコピペ&改変して使うためのもの。

■コード

mkbitarray.pl
#!/usr/bin/perl
use strict;
use warnings;
binmode STDOUT, ":raw";

my $bitarray = "";
while (<>) {
    chomp;
    my $x = tonum($_);
    vec($bitarray, $x, 1) = 1 if defined $x;
}
print $bitarray;

sub tonum {
    my ($s) = @_;
    return $s if $s =~ /^\d+$/;
    my $rv = 0;
    foreach my $c (split(//, $s)) {
	$rv = ($rv * 103 + ord($c)) % 1374;
    }
    return $rv;
}

trybitarray.pl
#!/usr/bin/perl
use strict;
use warnings;

my $fn = shift @ARGV;
open(my $fh, "<:raw", $fn) or die;
my $bitarray;
read $fh, $bitarray, -s $fn;
close($fh);

while (<>) {
    chomp;
    my $x = tonum($_);
    if (vec($bitarray, $x, 1)) {
	print "yes\n";
    } else {
	print "no\n";
    }
}

sub tonum {
    my ($s) = @_;
    return $s if $s =~ /^\d+$/;
    my $rv = 0;
    foreach my $c (split(//, $s)) {
	$rv = ($rv * 103 + ord($c)) % 1374;
    }
}

バイナリファイルの読み込みは、これで良いのか自信無し。

■実行例
% cat test.txt 
1234567
1500020
2431124
7777777
9876543
% ./mkbitarray.pl test.txt > test.ba 
% ./trybitarray.pl test.ba test.txt
yes
yes
yes
yes
yes
yes
% ./trybitarray.pl test.ba         
1
no
1234567
yes
2345
no
7777777
yes

関連

- [を] Perl の vec() で bit vector の操作[2011-04-02-4]
- [を] Bloom Filter の動作確認スクリプトを Perl で書いてみました[2011-04-28-3]