HTML::Table
を書き出すときに、特定の行をスキップしたいとします。これは、私がWebページから取得し、それらを正規表現としてコンパイルするいくつかのユーザパラメータに従って行う必要があります。Perlでは、複数の正規表現マッチを使用してDBI selectから返されたいくつかの行をスキップできますか?
パラメータは、大文字のNOT_*
です(cc08
などの値または郵便番号など)。 (他の場所でSQLクエリ用)whileループで
my $nameRegex = ($NOT_NAME) ? qr/$NOT_NAME/ : '';
my $rackRegex = ($NOT_RACK) ? qr/$NOT_RACK/ : '';
my $unitRegex = ($NOT_UNIT) ? qr/$NOT_UNIT/ : '';
my $addressRegex = ($NOT_ADDR) ? qr/$NOT_ADDR/ : '';
my $townRegex = ($NOT_TOWN) ? qr/$NOT_TOWN/ : '';
my $pcodeRegex = ($NOT_PCODE) ? qr/$NOT_PCODE/ : '';
私は、データを取得し、その結果、この行を追加し、「あなたはこれらのいずれにも一致しない限り、」私はイムがやって考えることです。
クエリ内の1つの結果だけが「cc08」のために省略されている必要がありながら、$NOT_RACK = "cc08"
= qr//;
(?-xism:cc08) = qr/cc08/;
= qr//;
= qr//;
= qr//;
= qr//;
問題は行がすべてに追加されていないですが
ために、次のようになりRegexs唾吐き
while ((my $id, my $name, my $rack, my $unit, my $town, my $address, my $pcode, my $lat, my $lon) = $select_sites->fetchrow_array()) {
my $checkbox = "<input type='checkbox' name='FILTER_SITE' value='$id' $checked{$id} />";
unless ($name =~ $nameRegex
|| $rack =~ $rackRegex
|| $unit =~ $unitRegex
|| $address =~ $addressRegex
|| $town =~ $townRegex
|| $pcode =~ $pcodeRegex) {
$rows++;
$sitesResultSection->addRow($checkbox, $name, $rack, $unit, $town, $address, $pcode, $lat, $lon);
}
、その他はすべて表示する必要があります。
私はこれをHTMLでやっているのは、SQLクエリに他のフィルタがあり(結果セットが大幅に制限されている)、ユーザ入力に応じてこれらのフィルタを動的にすることが悪夢になるからです。これは私が私が私のクエリのREGEXP
条件に使用したのと同じやり方で、それらのNOT_sを初期化する方法である
:
回答を受け入れ、しかし、私はさらに問題がありました。ユーザーが入力Thuslyたときに「市のracknameは、」それはここでは、SQLクエリからの抜粋ですCity
my $NOT_NAME = &useOrs(&trim($cgi->param('NOT_NAME')));
my $NOT_RACK = &useOrs(&trim($cgi->param('NOT_RACK')));
my $NOT_UNIT = &useOrs(&trim($cgi->param('NOT_UNIT')));
my $NOT_ADDR = &useOrs(&trim($cgi->param('NOT_ADDR')));
my $NOT_TOWN = &useOrs(&trim($cgi->param('NOT_TOWN')));
my $NOT_PCODE= &useOrs(&trim($cgi->param('NOT_PCODE')));
my $QUICK_SEARCH_SITES = &trim($cgi->param('QUICK_SEARCH_SITES'));
my $searchRegexp = ($QUICK_SEARCH_SITES) ? &useOrs($QUICK_SEARCH_SITES) : '.*';
sub useOrs {
my $tmp = $_[0];
$tmp =~ s/\s+/|/g;
return $tmp;
}
にラックを表示しますWHERE name REGEXP ? OR rack-id REGEXP ? OR [..]
だから、いくつかの合理的な柔軟性が使用するサルを訓練することなく達成され、これらのハックとツール。 は、しかし、私は下にあった
sub useAny {
my $tmp = $_[0];
$tmp =~ s/\s/./g;
return $tmp;
}
そして、最も重要な$var =~ /.*$NOT_VAR.*/i
を使用する代わりに&useOrs
を使用してのSQLフィルターの緩みを達成するために、単に$var =~ /$NOT_VAR/
は明らかにのみ正確に一致します大文字と小文字の区別など を使用して印象的なのは、Perlでハックすることになっているという印象。:)まだ提案は大歓迎です。
別の質問がある場合は、別の質問を投稿してください。 * 1つはPerlでハックすることになっています*はうまく反映されません。プログラミング言語が何であれ、壁に物を投げつけるまでしばらくの間、物事を投げるのは正しいアプローチではありません。 –
自分のコードでさらに問題が発見されたため、私は投稿を拡大していません。ハッキングは問題を正しく解決するはずですか?私は現在受け入れられている解決策が適切かつ堅牢で読みやすいと感じています – Recct
'/.* ...。* /'はperl正規表現のデフォルトの動作であり、追加する必要はありません。 '/ $ NOT_VAR /'は '/.*$ NOT_VAR。* /'とまったく同じものにマッチします。何かをキャプチャしている場合や '/ g'オプションを使用している場合にのみ重要です。あなたはそうではありません。 – TLP