当我写出 a 时,HTML::Table
我想跳过某些行。这应该根据我从网页获得的一些用户参数来完成,并将它们编译为正则表达式。
参数是大写的NOT_*
,带有诸如cc08
邮政编码之类的值。
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/ : '';
在while循环中(对于其他地方的SQL查询)我得到数据,我认为我正在做的是“除非你匹配其中任何一个”添加这行结果。
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);
}
吐出正则表达式看起来像这样$NOT_RACK = "cc08"
= qr//;
(?-xism:cc08) = qr/cc08/;
= qr//;
= qr//;
= qr//;
= qr//;
但是问题是根本没有添加任何行,而“cc08”必须省略查询中的一个结果,并且必须显示所有其他结果。
我在 HTML 中这样做的原因是因为 SQL 查询中已经有其他过滤器(显着限制了结果集),并且根据用户输入使这些过滤器动态化将是一场噩梦。
接受了答案,但是我还有一个问题:
这就是我初始化那些 NOT_s 的方式,与我用于查询REGEXP
条件的方式相同。因此,当用户输入“City rackname”时,它会在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;
}
这是 SQL 查询的摘录WHERE name REGEXP ? OR rack-id REGEXP ? OR [..]
因此,通过这些技巧可以实现一些合理的灵活性,而无需训练将使用该工具的猴子。但是,仅使用$var =~ /$NOT_VAR/
显然只会完全匹配,区分大小写等。为了实现 SQL 过滤器的松散性,而不是使用&useOrs
我使用
sub useAny {
my $tmp = $_[0];
$tmp =~ s/\s/./g;
return $tmp;
}
而且最重要的是$var =~ /.*$NOT_VAR.*/i
我的印象是应该用 Perl 破解所以那里.. :) 仍然欢迎提出建议。