以下の関数の解説お願いします。
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,
といったデータファイルです。
よろしくお願いします。
お礼
$strを使わずに指定したら簡単に変換できました。プログラムは考えるものかもしれませんが、やはりしっかりと回答を頂きたいです。こちらはコネも助言も何もない状態で構築しなければならない落ちこぼれプログラマなのですから。