दिलचस्प पोस्ट
ट्रिगर एन्कक्रोनस अजाक्स पर इनपुट = फाइल पर क्लिक करें () सी # DLL config फाइल जावास्क्रिप्ट में स्क्रिप्ट को समाप्त कैसे करें JSON के लिए XSLT बराबर जावा के System.out में तालिका प्रारूप में आउटपुट मैं एसवीएन के साथ एक निर्देशिका को कैसे अनदेखा कर सकता हूं? कितने पैरामीटर बहुत अधिक हैं? अजगर में पूर्णांक वर्गमूल फ्लैश गेम के पीएचपी-आधारित उच्चतम स्कोर की मेजबानी करने वाले लोगों को रोकने का सबसे अच्छा तरीका क्या है? जब सेलेनियम वेबड्रिवर में स्पष्ट इंतजार बनाम अमिट इंतजार का उपयोग करना है? कैसे एक पायथन datetime ऑब्जेक्ट सेकंड के लिए परिवर्तित करने के लिए ACTION_SEND इरादे के लिए विशिष्ट एप्लिकेशन फ़िल्टर कैसे करें (और प्रत्येक ऐप के लिए एक अलग टेक्स्ट सेट करें) कोणीय जेएस में एकाधिक मान (या ऑपरेशन) कैसे फ़िल्टर करें एएसपी.नेट एमवीसी 3 एक्शन फिल्टर में निर्भरताएं इंजेक्शन इस दृष्टिकोण में क्या गलत है? Hadoop Namenode विफलता प्रक्रिया कैसे काम करता है?

पर्ल में एक स्ट्रिंग में फ़ाइल को गलाने का सबसे अच्छा तरीका क्या है?

हां, एक ऐसा तरीका है जो इसे करने के लिए ज्यादा है लेकिन एक कैनोनिकल या सबसे कुशल या सबसे संक्षिप्त तरीका होना चाहिए। मैं उन उत्तरों को जोड़ूंगा जिनके बारे में मैं जानता हूं और देखता हूं कि शीर्ष पर क्या हो रहा है।

स्पष्ट होने के लिए, सवाल यह है कि किसी फ़ाइल की सामग्री को स्ट्रिंग में कैसे पढ़ना सबसे अच्छा है। जवाब प्रति एक समाधान

वेब के समाधान से एकत्रित समाधान "पर्ल में एक स्ट्रिंग में फ़ाइल को गलाने का सबसे अच्छा तरीका क्या है?"

इस बारे में कैसा है:

use File::Slurp; my $text = read_file($filename); 

ईटीए: बग # 83126 फ़ाइल-स्लरप के लिए: एन्कोडिंग के साथ सुरक्षा छेद (यूटीएफ -8) । मैं अब फाइल :: सोलर (अस्वीकरण: मैंने इसे लिखा है) का उपयोग करने की सलाह दी है, क्योंकि यह एनकोडिंग के आसपास बेहतर चूक है:

 use File::Slurper 'read_text'; my $text = read_text($filename); 

या पथ :: टिनी :

 use Path::Tiny; path($filename)->slurp_utf8; 

मुझे ऐसा एक ब्लॉक के साथ do है जिसमें मैं @ARGV स्थानांतरित करता @ARGV ताकि मैं डायमंड ऑपरेटर का उपयोग मेरे लिए फाइल मैजिक करने के लिए कर @ARGV

  my $contents = do { local(@ARGV, $/) = $file; <> }; 

यदि आपको थोड़ा और अधिक मजबूत होने की आवश्यकता है, तो आप इसे आसानी से सब्सट्रिन में बदल सकते हैं।

यदि आपको कुछ बहुत ही खास मामलों की ज़रूरत है, तो सभी प्रकार के विशेष मामलों को संभाल लें, फ़ाइल :: Slurp का उपयोग करें । यहां तक ​​कि अगर आप इसका उपयोग नहीं करने जा रहे हैं, स्रोत को देखने के लिए उन सभी निराला स्थितियों को देखने के लिए जो इसे संभालना है। फ़ाइल :: Slurp की एक बड़ी सुरक्षा समस्या है जो समाधान नहीं है। इसका पूरा हिस्सा एन्कोडिंग को ठीक से चलाने में विफल रहता है। यहां तक ​​कि मेरे त्वरित उत्तर में यह समस्या है। अगर आपको एन्कोडिंग संभालना है (शायद क्योंकि आप डिफ़ॉल्ट रूप से सब कुछ यूटीएफ -8 नहीं बनाते हैं), यह इस प्रकार फैलता है:

 my $contents = do { open my $fh, '<:encoding(UTF-8)', $file or die '...'; local $/; <$fh>; }; 

यदि आपको फ़ाइल को बदलने की आवश्यकता नहीं है, तो आप फ़ाइल :: मानचित्र का उपयोग करने में सक्षम हो सकते हैं

लिखित फाइल में: स्लरप (जो सबसे अच्छा तरीका है), उरी गटमैन ने कई तरह के तरीकों से गले लगाने के लिए बहुत कुछ किया और जो सबसे अधिक कुशल है उन्होंने अपने निष्कर्षों को यहां लिखा और उन्हें जानकारी फ़ाइल :: Slurp को शामिल किया।

 open(my $f, '<', $filename) or die "OPENING $filename: $!\n"; $string = do { local($/); <$f> }; close($f); 

चीजों के बारे में सोचने के लिए (विशेष रूप से अन्य समाधानों की तुलना में):

  1. लेक्सिकल फाइलहंडल
  2. गुंजाइश कम करें
  3. जादू को कम करें

तो मुझे मिल रहा है:

 my $contents = do { local $/; open my $fh, $filename or die "Can't open $filename: $!"; <$fh> }; 

मैं जादू का बड़ा प्रशंसक नहीं हूं <> जब कि वास्तव में जादू का उपयोग करते हुए <> इसे बाहर फँसाने के बजाय, क्यों न सिर्फ खुली कॉल का सीधे उपयोग करें? यह अधिक काम नहीं है, और स्पष्ट है। (सच्चा जादू <>, विशेष रूप से जब संभालते हुए "-", पूरी तरह से अनुकरण करने के लिए बहुत अधिक काम है, लेकिन हम यहां इसका उपयोग नहीं कर रहे हैं।)

स्ट्रैप के mmap (मेमोरी मैपिंग) उपयोगी हो सकते हैं जब आप:

  • बहुत बड़े तार हैं, कि आप स्मृति में लोड नहीं करना चाहते हैं
  • एक आँख बंद करके तेजी से प्रारंभिक प्रारंभ करना चाहते हैं (आप क्रमिक I / O एक्सेस पर प्राप्त करते हैं)
  • स्ट्रिंग के लिए यादृच्छिक या आलसी पहुंच रखें।
  • स्ट्रिंग को अपडेट करना चाहते हैं, लेकिन केवल यह विस्तार कर रहे हैं या वर्णों को बदल सकते हैं:
 #!/usr/bin/perl use warnings; use strict; use IO::File; use Sys::Mmap; sub sip { my $file_name = shift; my $fh; open ($fh, '+<', $file_name) or die "Unable to open $file_name: $!"; my $str; mmap($str, 0, PROT_READ|PROT_WRITE, MAP_SHARED, $fh) or die "mmap failed: $!"; return $str; } my $str = sip('/tmp/words'); print substr($str, 100,20); 

अपडेट: मई 2012

Sys :: Mmap फ़ाइल :: मैप के स्थान के बाद निम्नलिखित बहुत अच्छी तरह से समतुल्य है

 #!/usr/bin/perl use warnings; use strict; use File::Map qw{map_file}; map_file(my $str => '/tmp/words', '+<'); print substr($str, 100, 20); 
 use Path::Class; file('/some/path')->slurp; 
 { open F, $filename or die "Can't read $filename: $!"; local $/; # enable slurp mode, locally. $file = <F>; close F; } 
 use IO::All; # read into a string (scalar context) $contents = io($filename)->slurp; # read all lines an array (array context) @lines = io($filename)->slurp; 

Perl6 :: Slurp का सारांश देखें जो अविश्वसनीय रूप से लचीला है और आमतौर पर बहुत कम प्रयास के साथ सही काम करता है।

यह न तो तेज़ है, न ही मंच स्वतंत्र है, और वास्तव में बुरा है, लेकिन यह कम है (और मैंने इसे लैरी वॉल के कोड में देखा है ;-):

  my $contents = `cat $file`; 

बच्चों, घर पर ऐसा मत करो 😉

यह करने के लिए सबसे लोकप्रिय तरीके की एक अच्छी तुलना है:

http://poundcomment.wordpress.com/2009/08/02/perl-read-entire-file/

कोई भी पढ़ या सिसेट के बारे में कुछ भी नहीं कहा, इसलिए यह एक सरल और तेज़ तरीका है:

 my $string; { open my $fh, '<', $file or die "Can't open $file: $!"; read $fh, $string, -s $file; # or sysread close $fh; } 

एक-लाइनर्स के लिए आप आमतौर पर -0 स्विच ( -n ) का उपयोग कर सकते हैं ताकि पर्ल पूरी फाइल को एक बार में पढ़ सके (यदि फ़ाइल में कोई रिक्त बाइट नहीं है):

 perl -n0e 'print "content is in $_\n"' filename 

यदि यह एक बाइनरी फ़ाइल है, तो आप -0777 उपयोग कर सकते हैं:

 perl -n0777e 'print length' filename 

यह करने के लिए सबसे खराब तरीके के लिए उम्मीदवार! (टिप्पणी देखें।)

 open(F, $filename) or die "OPENING $filename: $!\n"; @lines = <F>; close(F); $string = join('', @lines); 

विशेष रिकॉर्ड विभाजक परिवर्तनीय $/

 undef $/; open FH, '<', $filename or die "$!\n"; my $contents = <FH>; close FH; 
 # Takes the name of a file and returns its entire contents as a string. sub getfile { my($filename) = @_; my($result); open(F, $filename) or die "OPENING $filename: $!\n"; while(<F>) { $result .= $_; } close(F); return $result; }