2010-10-04 17 views
17
$ cat test.pl 
my $pid = 5892; 
my $not = system("top -H -p $pid -n 1 | grep myprocess | wc -l"); 
print "not = $not\n"; 
$ perl test.pl 
11 
not = 0 
$ 

मैं परिणाम को कैप्चर करना चाहता हूं i.e. 11 एक चर में। मैं उसे कैसे कर सकता हूँ?मैं एक पर्ल चर में सिस्टम कमांड का परिणाम कैसे संग्रहीत कर सकता हूं?

+0

भी देखें [क्या पर्ल में प्रणाली और बैकटिक और पाइप के बीच मतभेद है?] (http://stackoverflow.com/q/797127) – jww

उत्तर

40

Perlfaq8 से:

आप system() और backticks (``) के उद्देश्य के भ्रमित कर रहे हैं। सिस्टम() एक कमांड चलाता है और बाहर निकलने की स्थिति की जानकारी देता है (16 बिट मान के रूप में: कम 7 बिट सिग्नल प्रक्रिया से मर जाती है, यदि कोई हो, और उच्च 8 बिट वास्तविक निकास मान हैं)। बैकटीक्स (``) एक कमांड चलाते हैं और इसे वापस भेजते हैं जो इसे STDOUT को भेजा जाता है।

$exit_status = system("mail-users"); 
    $output_string = `ls`; 

पर्ल से बाहरी आदेश निष्पादित करने के कई तरीके हैं। उनके अर्थ के साथ सबसे आम हैं:

  • system(): यदि आप एक आदेश पर अमल करना चाहते हैं और इसके उत्पादन पर कब्जा करने के
  • exec नहीं करना चाहती: आप पर लौटने के लिए नहीं करना चाहते हैं बुला पर्ल स्क्रिप्ट
  • backticks: आप आदेश की उत्पादन कैप्चर करना चाहते हैं
  • open: आप पाइप के आदेश ( इनपुट या आउटपुट के रूप में) अपनी स्क्रिप्ट

करना चाहते हैं यह भी देखें How can I capture STDERR from an external command?

+0

धन्यवाद @ निखिल। – Lazer

9

पर्ल में `` सुविधा का उपयोग करने का सबसे आसान तरीका है। यह अंदर क्या होगा और वापस लौटाएगा जो स्टडआउट पर मुद्रित किया गया था:

my $pid = 5892; 
my $var = `top -H -p $pid -n 1 | grep myprocess | wc -l`; 
print "not = $var\n"; 

ऐसा करना चाहिए।

+0

$ पीआईडी ​​है बैकटीक्स के भीतर प्रतिस्थापन एक नई सुविधा? इसे 'v5.6.1' के साथ काम करने के लिए नहीं मिल सकता है। – Lazer

+0

इसने काम किया है जहां तक ​​मुझे याद है। उदा। कोशिश करें: 'perl -e '$ a =" हैलो "; प्रिंट \ '$ echo' ' –

7

बैकटिक बजाय qx{command} का उपयोग करें। मेरे लिए, यह थोड़ा बेहतर है क्योंकि: आप इसके साथ एसक्यूएल कर सकते हैं और उद्धरण से बचने की चिंता नहीं करते हैं। संपादक और स्क्रीन के आधार पर, मेरी पुरानी आंखें छोटी सी चीजों को याद करती हैं, और इसे कभी भी ग्लोब के विरुद्ध कोण ब्रैकेट्स का उपयोग करने जैसे अधिभारित होने में कोई समस्या नहीं होनी चाहिए।

+0

ग्रेट उत्तर! मेरी समस्या हल हो गई! – Alexey

2

backtick या qx का उपयोग करने में मदद करता है, उत्तर के लिए सभी को धन्यवाद। हालांकि, मैंने पाया कि यदि आप backtick या qx का उपयोग करते हैं, तो आउटपुट में पिछली नई रेखा होती है और मुझे इसे हटाने की आवश्यकता होती है। इसलिए मैंने chomp का उपयोग किया। यहाँ

chomp($host = `hostname`); 
chomp($domain = `domainname`); 
$fqdn = $host.".".$domain; 

अधिक जानकारी: http://irouble.blogspot.in/2011/04/perl-chomp-backticks.html