我编写了一个脚本,我在其中传递(可选,我希望!)命令行参数并将它们发送到 MySQL 查询。如果有任何省略,我希望查询基本上忽略该参数。如果我通过所有 3,我的查询正在工作。如果我通过第二个(整数)和第三个(字母),脚本也可以工作。但是,如果我省略了 int 或 letter 我没有得到任何结果。
我试图通过在我的 MySQL 查询中使用 ISNULL 和 Coalesce 来解决这个问题,因为如果我没有在命令行参数中明确传递它们,我不确定声明的变量是 null 还是空。
目前,如果我通过“Perl Script.pl -s Hockey -i 10 -lh”或“Perl Script.pl -i 20 -l z”,它可以工作,但在 3 个参数的任何其他迭代下都会失败。
我想知道的是 1. 我是否按照我的意愿使参数成为可选的?我应该使用 getopts 而不是 getopt 吗?2. 我需要对我的 MySQL 查询进行哪些更改才能使其按预期工作?为什么 ISNULL 或 Coalesce 不起作用?3. 我传递或传递数据的方式还有什么不正确的吗?
#!/usr/bin/perl -w
use warnings;
use DBI;
use Getopt::Std;
use strict;
getopt('s:il');
our ($opt_s);
our ($opt_i);
our ($opt_l);
my $sport_search;
if ($opt_s) ($sport_search=$opt_s);
my $integer_search;
if ($opt_i=~m/\d+/) {$integer_search=$opt_i};
my $letter_search;
if ($opt_l =~m/^[a-zA-Z]$/) {$letter_search=$opt_l};
my $g_hash = function1($sport_search,$integer_search,$letter_search);
my $string = "Just a string!";
if (&function2($g_hash,$string) != 0) {
print "No values found for '$sport_search'","\n";
};
sub function1 {
my ($lsport_search,$linteger_search,$lletter_search) = @_;
our $dbh = DBI->connect{"dbi:mysql:dbname=database", "root", "password")
or die $DBI::errstr;
my $sql = "SELECT * from Players_Sport where Sport like '$lsport_search' AND length(Player)<=ISNULL('$linteger_search',20) AND Player between 'a' and ISNULL('lletter_search",'z')";
my $hash_ref = $dbh->selectall_hashref($sql, 'Player')
or die $DBI::errstr;
$dbh->disconnect
or warn "Disconnection failed: $DBI::errstr\n";
return $hash_ref;
}
sub function2 {
my ($l_hash,$variable_two) = @_;
my $hashvalue=();
if(keys $l_hash == 0) {
$hashvalue = -1;
}
else {$hashvalue = 0;
print "$_\n" for (keys %$l_hash);
};
return $hashvalue;
}