Perl Language
एक चर में एक फ़ाइल की सामग्री को पढ़ना
खोज…
मैनुअल तरीका है
open my $fh, '<', $filename
or die "Could not open $filename for reading: $!";
my $contents = do { local $/; <$fh> };
फ़ाइल खोलने के बाद (यदि आप कच्चे बाइट्स के बजाय विशिष्ट फ़ाइल एन्कोडिंग पढ़ना चाहते हैं, तो man perlio
पढ़ें), ट्रिक do
ब्लॉक में है: <$fh>
, डायमंड ऑपरेटर में फ़ाइल हैंडल, फ़ाइल से एकल रिकॉर्ड लौटाता है । "इनपुट रिकॉर्ड विभाजक" चर $/
निर्दिष्ट करता है कि "रिकॉर्ड" क्या है - डिफ़ॉल्ट रूप से यह एक नए वर्ण पर सेट है, इसलिए "एक रिकॉर्ड" का अर्थ है "एक एकल पंक्ति"। जैसा कि $/
एक वैश्विक चर है, local
दो चीजें करता है: यह $/
की एक अस्थायी स्थानीय प्रतिलिपि बनाता है $/
जो ब्लॉक के अंत में गायब हो जाएगा, और इसे (गैर-) मूल्य undef
("मान" जो पर्ल देता है) अनधिकृत चर के लिए)। जब इनपुट रिकॉर्ड विभाजक में वह (गैर) मूल्य होता है, तो हीरा ऑपरेटर पूरी फाइल लौटा देगा। (यह संपूर्ण फ़ाइल को एक पंक्ति मानता है।)
do
का उपयोग करके, आप मैन्युअल रूप से एक फ़ाइल खोलने के आसपास भी प्राप्त कर सकते हैं। फ़ाइलों के बार-बार पढ़ने के लिए,
sub readfile { do { local(@ARGV,$/) = $_[0]; <> } }
my $content = readfile($filename);
इस्तेमाल किया जा सकता है। यहाँ, एक अन्य वैश्विक चर ( @ARGV
) एक समान प्रक्रिया का उपयोग करने के लिए स्थानीयकृत किया जाता है, जब पैरामीटर के साथ एक पर्ल स्क्रिप्ट शुरू करते हैं। $/
अभी भी undef
, क्योंकि इसके सामने की सरणी सभी आने वाले तर्कों को "खाती है"। इसके बाद, हीरा ऑपरेटर <>
फिर से $/
(पूरी फ़ाइल) द्वारा परिभाषित एक रिकॉर्ड देता है और do
ब्लॉक से रिटर्न do
है, जो बदले में उप से वापसी करता है।
उप में कोई स्पष्ट त्रुटि हैंडलिंग नहीं है, जो बुरा अभ्यास है! यदि फ़ाइल को पढ़ते समय कोई त्रुटि होती है, तो आपको रिटर्न मान के रूप में undef
मिलेगा, जैसा कि एक खाली फ़ाइल से रिक्त स्ट्रिंग के विपरीत है।
अंतिम कोड का एक और नुकसान यह है कि आप अलग-अलग फ़ाइल एन्कोडिंग के लिए PerlIO का उपयोग नहीं कर सकते हैं - आपको हमेशा कच्ची बाइट्स मिलती हैं।
पथ :: टिनी
एक स्क्रिप्ट में कई बार मैन्युअल तरीके से मुहावरे का उपयोग करना जल्द ही थकाऊ हो जाता है, इसलिए आप एक मॉड्यूल आज़माना चाहते हैं।
use Path::Tiny;
my $contents = path($filename)->slurp;
यदि आपको फ़ाइल एन्कोडिंग, लाइन एंडिंग आदि पर नियंत्रण की आवश्यकता है, तो आप एक binmode
विकल्प पास कर सकते हैं - man perlio
देखें:
my $contents = path($filename)->slurp( {binmode => ":encoding(UTF-8)"} );
Path::Tiny
फाइलों से निपटने के लिए Path::Tiny
पास कई अन्य कार्य भी हैं , इसलिए यह एक अच्छा विकल्प हो सकता है।
फ़ाइल :: Slurper
यह एक न्यूनतावादी मॉड्यूल है जो केवल फाइलों को चर में खिसकाता है, और कुछ नहीं।
use File::Slurper 'read_text';
my $contents = read_text($filename);
फ़ाइल एन्कोडिंग को निर्दिष्ट करने के लिए read_text()
दो वैकल्पिक पैरामीटर लेता है और क्या लाइन एंडिंग को अनिक्सिश LF या DOSish CRLF मानकों के बीच अनुवाद किया जाना चाहिए:
my $contents = read_text($filename, 'UTF-8', 1);
फ़ाइल :: Slurp
इसका उपयोग न करें। हालांकि यह लंबे समय से है और अभी भी मॉड्यूल सबसे प्रोग्रामर का सुझाव देगा, यह टूट गया है और तय होने की संभावना नहीं है ।
फ़ाइल को किसी सरणी चर में स्लैप करना
open(my $fh, '<', "/some/path") or die $!;
my @ary = <$fh>;
जब सूची के संदर्भ में मूल्यांकन किया जाता है, तो हीरा ऑपरेटर फ़ाइल में सभी पंक्तियों से मिलकर एक सूची देता है (इस मामले में, एक सरणी आपूर्ति सूची के संदर्भ में परिणाम निर्दिष्ट करता है)। लाइन टर्मिनेटर को बरकरार रखा गया है, और उसे काट कर निकाला जा सकता है:
chomp(@ary); #removes line terminators from all the array elements.
एक-लाइनर में स्लरप फाइल
इनपुट रिकॉर्ड विभाजक को -0
स्विच ( शून्य , कैपिटल ओ ) के साथ निर्दिष्ट किया जा सकता है। यह मूल्य के रूप में एक अष्टाधारी या हेक्साडेसिमल संख्या लेता है। किसी भी मान 0400
या उससे ऊपर के कारण पर्ल को स्लर फाइल्स में बदल जाएगा, लेकिन कन्वेंशन द्वारा, इस उद्देश्य के लिए उपयोग किया गया मान 0777
।
perl -0777 -e 'my $file = <>; print length($file)' input.txt
अतिसूक्ष्मवाद के साथ आगे बढ़ते हुए, निर्दिष्ट करने से -n
स्विच पर्ल को स्वचालित रूप से प्रत्येक पंक्ति (हमारे मामले में - पूरी फ़ाइल) को चर $_
में पढ़ने का कारण बनता है।
perl -0777 -ne 'print length($_)' input.txt