2013-06-04 30 views
2

我是新來的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 
} 
+1

我會重寫回報'格格你不妨擺脫浪費無用使用cat的(@ cmd = qx/$ cmd /); return @cmd;' – mob

回答

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 
} 

一個寫的原始腳本不知道陣列可以一次chomped,所以他用mapchomp行線。

&在子程序調用前是不必要的,除此之外,我徘徊爲什麼參數傳遞到query_db當子程序不使用它們。

3

你對錯誤的事情感到煩惱。開始讓你的程序正確。

my $cmd = "cat /tmp/sql.$$ | db.sh -d ~~~ $db"; 

應該BNE

use String::ShellQuote qw(shell_quote); 
my $cmd = "cat /tmp/sql.$$ | db.sh -d ~~~ ".shell_quote($db)"; 

,雖然你在它

use String::ShellQuote qw(shell_quote); 
my $cmd = "db.sh -d ~~~ ".shell_quote($db)." </tmp/sql.$$"; 
+0

hm ... String :: ShellQuote? – jm666

+0

處理'$ db'中的shell元字符(如果有的話)。 – ikegami

+0

:)當然 - 而是'使用ShellQuote;'需要'使用String :: ShellQuote;' – jm666