जब इनपुट फ़ाइल नहीं मिली तो perl script (run with -n / -p) को फेल करने के लिए सबसे अच्छा (मुहावरा) कैसे?


11
$ perl -pe 1 foo && echo ok
Can't open foo: No such file or directory.
ok

मैं वास्तव में पर्ल स्क्रिप्ट को पसंद करूँगा जब फ़ाइल मौजूद नहीं होगी। जब इनपुट फ़ाइल मौजूद नहीं है, तो -p या -n बनाने का "उचित" तरीका क्या है?

जवाबों:


6

-P स्विच सिर्फ इस पाश में अपने कोड (तर्क निम्नलिखित -e) लपेटने के लिए एक शॉर्टकट है:

LINE:
  while (<>) {
      ...             # your program goes here
  } continue {
      print or die "-p destination: $!\n";
  }

(एन एक ही है, लेकिन जारी ब्लॉक के बिना।)

<>खाली ऑपरेटर के बराबर है readline *ARGV, और कहा कि से पढ़ने के लिए एक फ़ाइल के रूप में लगातार प्रत्येक तर्क को खोलता है। उस निहित खुले की त्रुटि से निपटने को प्रभावित करने का कोई तरीका नहीं है, लेकिन आप चेतावनी को घातक बना सकते हैं (नोट, यह -i स्विच से संबंधित कई चेतावनियों को भी प्रभावित करेगा):

perl -Mwarnings=FATAL,inplace -pe 1 foo && echo ok

@MarkReed inplace वह चेतावनी श्रेणी है जिसमें हम रुचि रखते हैं। अन्य चेतावनियों को प्रभावित करने का कोई कारण नहीं है।
ग्रिंज

से चेतावनी :The presence of the word "FATAL" in the category list will escalate warnings in those categories into fatal errors in that lexical scope.
Grinnz

सही है, inplaceश्रेणी है; इसके बिना, -Mwarnings=FATALसाधन FATAL => all, जो हम नहीं चाहते हैं। समझ गया।
मार्क रीड

4

लूप के शरीर में एक ध्वज सेट करें, फ़ाइनलाइनर के अंत में END ब्लॉक में ध्वज की जांच करें।

perl -pe '$found = 1; ... ;END {die "No file found" unless $found}' -- file1 file2

ध्यान दें कि यह तभी विफल होता है जब कोई फ़ाइल संसाधित नहीं हुई थी।

समस्या की रिपोर्ट करने के लिए जब सभी फाइलें नहीं मिली हैं, तो आप कुछ का उपयोग कर सकते हैं

perl -pe 'BEGIN{ $files = @ARGV} $found++ if eof; ... ;END {die "Some files not found" unless $files == $found}'

1
यदि आपकी स्क्रिप्ट को स्टड से पढ़ने के बजाय तर्कों के रूप में फ़ाइलों को लेना चाहिए, तो इस समाधान का एक हल्का विकल्प होगा BEGIN{die "File not found" unless -f $ARGV[0]}। (मैं कहता हूं लाइटर, क्योंकि इसमें एक ध्वज स्थापित करना और कोड के 2 टुकड़े जोड़ना शामिल नहीं है)
दादा

यह भी मानता है कि सभी फाइलें गैर-शून्य लंबाई की हैं।
टंकटालस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.