最後のは動作確認。% tar zxvf sufary-2.3.8.tar.gz % cd sufary-2.3.8 % libtoolize --force % ./configure % make % src/mkary README; src/sass a README
(ref. http://gimmix.org/max/article.php?id=311)SED=sed ;export SED
% ./configure --host=i686-apple-macosx % make % src/mkary README; src/sass a README
% cat a.txt foo フー bar バー hoge ほげ uhyo うひょ % mkary -l a.txt
#!/usr/bin/perl
use strict;
use warnings;
use SUFARY;
my $fn = shift @ARGV;
my $sa = SUFARY->new($fn);
# convert (demo)
for (my $i = 0; $i < $sa->{arraysize}; $i++) {
my $str = id2str($sa, $i);
my ($key, $info) = split(' ', $str, 2);
print qq(id:$i => key:"$key", info:"$info"\n);
my $id = str2id($sa, $key." ");
print qq(key:"$key" => id:$id\n);
}
# error
my $str = id2str($sa, 100);
print qq(error1: "$str"\n); # empty
my $id = str2id($sa, "dummy");
print qq(error2: $id\n); # -1
sub id2str {
my ($sa, $id) = @_;
return "" unless 0 <= $id and $id < $sa->{arraysize};
my $str = $sa->get_line($sa->get_position($id));
chomp $str;
return $str;
}
sub str2id {
my ($sa, $key) = @_;
my ($left, $right) = $sa->range_search($key);
return -1 if not defined $left or $left != $right;
return $left;
}
fooとbarの順番が入れ替わっているのは、suffix array の性質上アルファベティカルにソートされてるため。% ./idstr.pl a.txt id:0 => key:"bar", info:"バー" key:"bar" => id:0 id:1 => key:"foo", info:"フー" key:"foo" => id:1 id:2 => key:"hoge", info:"ほげ" key:"hoge" => id:2 id:3 => key:"uhyo", info:"うひょ" key:"uhyo" => id:3 error1: "" error2: -1
#!/usr/bin/perl
# id2str.pl
use strict;
use warnings;
use SUFARY;
my ($id, $fn) = @ARGV;
my $sa = SUFARY->new($fn);
print id2str($sa, $id), "\n";
sub id2str {
my ($sa, $id) = @_;
return "" unless 0 <= $id and $id < $sa->{arraysize};
my $str = $sa->get_line($sa->get_position($id));
chomp $str;
return $str;
}
#!/usr/bin/perl
# str2id.pl
use strict;
use warnings;
use SUFARY;
my ($key, $fn) = @ARGV;
my $sa = SUFARY->new($fn);
print str2id($sa, $key." "), "\n";
sub str2id {
my ($sa, $key) = @_;
my ($left, $right) = $sa->range_search($key);
return -1 if not defined $left or $left != $right;
return $left;
}
% ./id2str.pl 0 a.txt bar バー % ./id2str.pl 3 a.txt uhyo うひょ % ./str2id.pl foo a.txt 1 % ./str2id.pl uhyo a.txt 3
#!/usr/bin/perl
use strict;
use warnings;
my $fn = shift @ARGV;
my $data = load_data($fn);
store_data($fn, $data);
sub load_data {
my ($fn) = @_;
require Storable;
scalar eval { Storable::retrieve($fn) } || [];
}
sub store_data {
my($fn, $data) = @_;
require Storable;
Storable::nstore($data, $fn);
}