2010-03-10 16 views
23

मुझे system फ़ंक्शन के साथ कोई समस्या है। मैं सिस्टम वर्क्स आउटपुट को एक चर में स्टोर करना चाहता हूं।मैं पर्ल के सिस्टम फ़ंक्शन आउटपुट को एक चर में कैसे स्टोर कर सकता हूं?

उदाहरण के लिए,

system("ls"); 

यहाँ मैं मौजूदा निर्देशिका में सभी फ़ाइल नाम एक चर में संग्रहीत करना चाहते हैं। मुझे पता है कि मैं आउटपुट को एक फ़ाइल में रीडायरेक्ट करके कर सकता हूं और उस से पढ़ सकता हूं और उसे एक चर में स्टोर कर सकता हूं। लेकिन मैं उससे एक कुशल तरीका चाहता हूँ। क्या कोई रास्ता है ।

+1

उपयोग में उत्पादन स्टोर करने के लिए 'मेरी $ उत्पादन = qx (ls 2> &1);' आखिरी हिस्सा दोनों stdout और stderr कब्जा करने के लिए है –

उत्तर

16

नहीं, आप ls उत्पादन, प्रणाली के बाद से की मान संग्रहीत नहीं कर सकते हमेशा की तरह, एक बच्चे की प्रक्रिया के रूप आदेश पर अमल तो बैकटिक साथ कोशिश `जो command` वर्तमान ही प्रक्रिया में आदेश निष्पादित करता है!

my $value = qx(ls); 
print $value; 

उत्पादन ls के समान है:

+4

@abubacker -। बैकटिक एक पर अमल करता है बाल प्रक्रिया –

+5

बैकिक्स एक बच्चे की प्रक्रिया में कमांड निष्पादित करते हैं और इसके आउटपुट को कैप्चर करते हैं। अगर आप उसी प्रक्रिया में कमांड को निष्पादित करना चाहते हैं, तो आप 'exec' का उपयोग करें - लेकिन यह कभी वापस नहीं आएगा क्योंकि मूल पर्ल कोड अब नहीं चल रहा है प्रक्रिया को अन्य कमांड पर बदलना। –

+0

कोई भी एक चर के आउटपुट को स्क्रीन पर दिखाए बिना एक चर के आउटपुट को कैप्चर करने के बारे में कैसे जाएगा? – antred

12

सबसे आसान तरीका है बैकटिक या qx() उपयोग करता है।

+1

'echo' i एक शेल कमांड है, पर्ल समकक्षों को 'प्रिंट' और 'कहना' कहा जाता है। – daxim

+0

यह ls के लिए काम करता है, लेकिन खोज कमांड के लिए नहीं, इसके लिए मुझे लगता है कि इसकी बैकटीक्स, http://stackoverflow.com/questions/3854651/how-can-i-store-the-result-of-a-system- कमांड में एक पर्ल-चर। –

10

मेरा उत्तर आपकी समस्या का समाधान नहीं करता है। हालांकि, अगर आप वास्तव में निर्देशिका सूची करना चाहते हैं, तो इस तरह सिस्टम ls पर कॉल न करें। opendir(), readdir(), या while लूप का उपयोग करें।

उदाहरण के लिए

,

while (<*>){ 
    print $_ ."\n"; 
} 

वास्तव में, यदि यह एक तीसरे पक्ष के मालिकाना कार्यक्रम नहीं है, हमेशा उपयोगकर्ता पर्ल के अपने कार्यों के लिए प्रयास करें।

7

के लिए सरकारी पर्ल प्रलेखन निर्मित system समारोह कहता है:

यह नहीं है कि तुम क्या है कि आप का उपयोग करना चाहिए के लिए, कब्जा एक आदेश से उत्पादन करने के लिए उपयोग करना चाहते हैं केवल बैकटिक या qx //, जैसा कि perlop में "STRING" में वर्णित है।

  1. कमांड लाइन पर: perldoc.perl.org पर perldoc -f system
  2. ऑनलाइन

वहाँ आसानी से डॉक्स में पहुंचने में कई तरीके हैं।

  • Google का उपयोग कर वेब पर खोजें।
  • आप प्रत्येक निर्देशिका एक अलग सरणी तत्व में संग्रहीत लिस्टिंग चाहते हैं, का उपयोग करें:

    my @entries = qx(ls); 
    
    9

    abubacker के रूप में कहा गया है, आप बैकटिक उपयोग कर सकते हैं बाद में उपयोग के लिए एक चर में एक कार्यक्रम के उत्पादन में कब्जा करने के लिए।हालांकि, अगर आप भी असाधारण वापसी मूल्यों, या बाईपास खोल लागू के लिए जांच करने की आवश्यकता है, यह एक CPAN मॉड्यूल में लाने के लिए समय, IPC::System::Simple है:

    use IPC::System::Simple qw(capture); 
    
    # Capture output into $result and throw exception on failure 
    my $result = capture("some_command"); 
    

    इस मॉड्यूल विभिन्न तरीकों से में कहा जा सकता है, और अनुमति देता है आप अनुकूलित करने के लिए कौन सा त्रुटि वापसी मान "स्वीकार्य" हैं, चाहे शैल को बाईपास करें या नहीं, और तर्कों के समूह को कैसे संभालना है। यह system() के लिए एक ड्रॉप-इन प्रतिस्थापन भी प्रदान करता है जो अधिक त्रुटि-जांच जोड़ता है।

    0

    यह करने के लिए एक त्वरित और आसान तरीका है अपने उदाहरण के लिए विशेष रूप से qx() उपयोग करने के लिए है:

    my $output = qx(ls 2>&1);

    2>&1 हिस्सा दोनों stdout और stderr कब्जा करने के लिए है।

    2

    उपयोग बैकटिक एक चर

    $output = `ls`; 
    
    +0

    खैर, यह जानकारी पहले से ही अन्य उत्तरों में दी गई थी। – fancyPants

    संबंधित मुद्दे

     संबंधित मुद्दे