我是Perl的新手,但我想让以下返回更具可读性。
我别无选择,只能维护这段旧代码。
我在某些地方读过,从不同时使用qx
和$_
我在考虑将$_
存储在变量中并返回该变量。
为什么返回的最后一个参数会被执行?这对我来说是一个奇怪的概念(Java开发人员)
该脚本将sql查询的内容输出到命令行,然后解析它并使用它执行各种例程。
堆栈溢出的大师会想到什么?
sub query_db {
my $cmd = "cat /tmp/sql.$$ | db.sh -d ~~~ $db";
return map {chomp; $_;} qx/$cmd/;
}
foreach my $row (&query_db($sql, "database")) {
blah
}
答案 0 :(得分:3)
你在为错误的事情烦恼。首先让你的程序正确。
my $cmd = "cat /tmp/sql.$$ | db.sh -d ~~~ $db";
应该
use String::ShellQuote qw( shell_quote );
my $cmd = "cat /tmp/sql.$$ | db.sh -d ~~~ ".shell_quote($db)";
你也可以摆脱cat
在你使用时无用的浪费
use String::ShellQuote qw( shell_quote );
my $cmd = "db.sh -d ~~~ ".shell_quote($db)." </tmp/sql.$$";
答案 1 :(得分:1)
这与上面基本相同,
sub query_db {
my $cmd = "cat /tmp/sql.$$ | db.sh -d ~~~ $db";
my @out = qx/$cmd/;
chomp(@out);
return @out;
}
foreach my $row (query_db($sql, "database")) {
blah
}
编写原始脚本的人不知道数组可以立即被扼杀,所以他使用map
到chomp
行是行。
&
是不必要的,除此之外,为什么当子程序不使用它们时,为什么参数传递给query_db
。