以下の関数の解説お願いします。
Perl初心者のため、stdio.plにある
この関数のやっていることがよく分からず困っています。
sub searchString #($str, $key, $mhmode, $lc, $z2h, $k2h, $igmark)
{
local($str, $key, $mhmode, $lc, $z2h, $k2h, $igmark) = @_;
local($once, $from, $to);
#static $key2, $key3;
return 0 if ($str eq "" || $key eq "");
if ($key eq $key2) {
$key = $key3;
$once = 1;
} else {
$key2 = $key;
}
if ($jcode'version) {
if ($k2h) {
$from = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポゐゑァィゥェォャュョッ';
$to = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヰヱぁぃぅぇぉゃゅょっ';
}
if ($z2h) {
$from .= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-=_|*!?”#$¥%&@:;';
$to .= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-=_|*!?"#$\%&@:;';
}
if ($igmark) {
$from .= '-ー・/_ ';
$to .= '------';
}
if ($from) {
&jcode'tr(*str, $from, $to);
&jcode'tr(*key, $from, $to) if (!$once);
$str =~ tr/-_\///d;
$key =~ tr/-_\///d;
}
}
if ($lc) {
$str =~ tr/A-Z/a-z/;
$key =~ tr/A-Z/a-z/ if (!$once);
}
$key3 = $key;
if ($mhmode == 5 || $mhmode =~ /^BOOLEAN$/i || $mhmode =~ /^BLN$/i) {
local($i) = 0;
local(@str, $eval);
$key =~ s/ +AND +/ & /gi;
$key =~ s/ *NOT +/ ! /gi;
$key =~ s/ +OR +/ | /gi;
$key =~ s/\( +/(/g;
$key =~ s/ +\)/)/g;
foreach (split /( & | \| )/, $key) {
$str[$i] .= $_;
$i ++ unless ($_ eq ' & ' || $_ eq ' | ')
}
for ($i = 0; $i <= $#str; $i ++) {
local($option, $open, $close, $find, $not, $key);
$key = $str[$i];
if ($str[$i] =~ /^( & | \| )/) {
$option = substr $key, 0, 3;
$key = substr $key, 3;
}
$open = $1 if ($key =~ /^(\(+)/g);
$close = $1 if ($key =~ /(\)+)$/g);
$key =~ s/\(|\)//g;
if ($key =~ /^ *! +/) {
$key =~ s/^ *! +//g;
$not = 1;
}
$find = index($str, $key) >= 0 ? 1 : 0;
$find = $find ? 0 : 1 if ($not);
$eval .= "$option$open$find$close";
}
$eval =~ s/ & /*/g;
$eval =~ s/ \| /+/g;
return (eval $eval >= 1) ? 1 : 0;
} elsif ($mhmode == 4 || $mhmode =~ /^NOR$/i) {
foreach (split / +/, $key) {
return 0 if (index($str, $_) >= 0);
}
return 1;
} elsif ($mhmode == 3 || $mhmode =~ /^EOR$/i) {
local($flag) = 0;
foreach (split / +/, $key) {
if (index($str, $_) >= 0) {
return 0 if ($flag);
$flag = 1;
}
}
return $flag ? 1 : 0;
} elsif ($mhmode == 2 || $mhmode =~ /^OR$/i) {
foreach (split / +/, $key) {
return 1 if (index($str, $_) >= 0);
}
return 0;
} elsif ($mhmode == 1 || $mhmode =~ /^NAND$/i) {
foreach (split / +/, $key) {
return 1 if (index($str, $_) == -1);
}
return 0;
} else {
foreach (split / +/, $key) {
return 0 if (index($str, $_) == -1);
}
return 1;
}
}
これを呼び出しているのが、別ファイル内の以下の部分です。
foreach(@datafile){
if($datafile[0] eq $_){ next; } # 1行目は項目名なので next
if($param{'query_word'}){
unless(stdio::searchString($_, $param{'query_word'}, $param{'query_search_type'}, 1, 1, 1, 1)){ next; }
}
push(@search_file,$_);
}
datafileは
名前,住所,電話番号,
吉田,東京都渋谷区,03xxxxxxxx,
といったデータファイルです。
よろしくお願いします。