2

我是 Perl 的新手,但我想让以下返回更具可读性。我别无选择,只能维护这个旧代码。我读过一些从不同时使用的qx地方$_

我正在考虑存储$_一个变量并返回它。return 的最后一个参数是怎么被执行的?对我来说这是一个奇怪的概念(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
}
4

2 回答 2

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.$$";
于 2013-06-04T17:23:02.157 回答
1

This is basically same as above,

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
}

one that wrote original script didn't know that array can be chomped at once, so he used map to chomp line be line.

& in front of subroutine call is unnecessary, and other than that I wander why are parameters passed to query_db when subroutine doesn't use them.

于 2013-06-04T17:09:51.843 回答