2013-03-15 35 views
0

這是一個簡單的Perl腳本,它接受2個參數 - 一個字符串(它是一個URL)和一個整數值。即使在退出循環後,Perl系統()命令也會運行

我所要做的就是在給定的時間段(以秒爲單位)對傳遞的URL運行curl請求。

當URL很簡單時就像http://admin:[email protected]:5074/?q=james一樣好,但當URL中存在&時就會出現問題。

問題是system()即使在退出循環後,curl請求仍會繼續運行。

發生了什麼事?

use strict; 
use warnings; 
use URI::Escape; 

my $url = uri_escape($ARGV[0]); 
print "URL=".$url."\n"; 
my $duration = $ARGV[1]; 
print $duration; 
my $start = time(); 
my $end = $start + $duration; 
my $request = 0; 

while(time() <= $end){ 
    system("curl --user admin:admin --digest ".uri_unescape($url)); 
    $request++; 
} 

print "------------------------ END ----------------------------------\n"; 
print "URL = ".uri_unescape($url)." \n"; 
print "Total requests made = ".$request."\n"; 
print "Reqs/sec = ".($request/$duration)."/sec \n"; 
#print $start."\n"; 
#print $end."\n"; 
print "Duration = ".$duration." sec \n"; 
print "-------------------------------------------------------------------\n"; 

的命令是:

perl curl.pl "http://admin:[email protected]:5074/?q=james&format=xml" 5 
+3

爲什麼不使用有光澤的'WWW :: Mechanize'或'LWP'模塊? – 2013-03-15 00:08:50

+0

我想使用本機perl模塊,因爲我希望能夠在任何機器上運行而無需處理安裝perl模塊 – Sudhakar 2013-03-15 00:24:00

+0

將URL傳遞給'uri_unescape'永遠是不正確的。 'uri_unescape'用於在非轉義分隔符之間查看組件。 – ikegami 2013-03-15 00:57:33

回答

8

。在你的URL中的字符&這是由貝殼爲「在後臺運行此命令」解釋。您需要轉義元字符如&適當,以避免殼解釋它們,無論是經由:

use String::ShellQuote qw(shell_quote); 
system("curl --user admin:admin --digest " . shell_quote($url)); 

或優選:

system('curl', '--user', 'admin:admin', '--digest', $url); 

後者以避免創建殼在所有,叉/執行人curl直接與給定的參數,這是自動轉義。它更快,更安全。有關更多信息,請參閱system perldoc

另外,您應該考慮使用LWP。它是新Perl(不安裝)的Perl核心的一部分,你不需要擔心轉義任何東西。

+0

太棒了!這樣可行。非常感謝@rjh,sputnik,ikegami和Kieth。欣賞你的時間。 – Sudhakar 2013-03-15 04:28:15

+0

也感謝您建議LWP。我會看看它 – Sudhakar 2013-03-15 04:29:31

相關問題