使输出缓冲区返回更易读/可维护

时间:2013-06-04 16:56:59

标签: perl bash

我是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
}

2 个答案:

答案 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
}

编写原始脚本的人不知道数组可以立即被扼杀,所以他使用mapchomp行是行。

子程序调用前面的

&是不必要的,除此之外,为什么当子程序不使用它们时,为什么参数传递给query_db