perl - $ $ के बिना पर्ल में_(सिंगल अंडरस्कोर) क्या है?




(2)

जब फ़ाइलटेस्ट (-एक्स) ऑपरेटर के साथ प्रयोग किया जाता है तो पिछले फ़ाइल परीक्षण की stat स्ट्रक्चर का उपयोग किया जाता है

यदि फ़ाइल परीक्षणों में से कोई भी (या या तो stat या lstat ऑपरेटर) को विशेष फ़ाइलहेडल दिया जाता है जिसमें एक अकेला रेखांकन होता है, तो पिछले फ़ाइल परीक्षण (या stat ऑपरेटर) की stat स्ट्रक्चर का उपयोग सिस्टम कॉल को सहेजने के लिए किया जाता है।
...
उदाहरण:

stat($filename);  
print "Readable\n" if -r _;  
print "Writable\n" if -w _;
...

तो आपके उदाहरण में !-d _ परीक्षण करता है कि अंतिम stat डाउन फ़ाइल निर्देशिका नहीं है या नहीं।

अद्यतन करें

असामान्य _ वास्तव में एक टाइपग्लोब *_ लेकिन ऑपरेटरों को एक फाइलहेडल की उम्मीद है * को छोड़ा जा सकता है, जैसे <*STDIN> <STDIN> रूप में लिखा जा सकता है। यह प्रतीक तालिका में पाया जाता है

print *{$main::{_}}{IO}, "\n";   # -->  IO::Handle=IO(0x2311970)

एक लाइनर में *_ को stat को कॉल करने के बाद ही सेट किया जाता है और _ बनाया जाता है।

मेरे पास कुछ कोड है:

if (!-d _ || !-o _ || ($vncUserDirUnderTmp && ($mode & 0777) != 0700)) {
    raise Exception("$prog: Wrong type or access mode of $vncUserDir.\n")
}

मुझे पर्ल में @_ और $_ बारे में जानकारी मिल सकती है लेकिन लगभग अकेले नहीं। -d _ और -o _ में इसका क्या अर्थ है?


जब आप फ़ाइल परीक्षण ऑपरेटर ( -f , -d , -s , आदि) में से किसी एक को कॉल करते हैं तो पर्ल वास्तव में ऑपरेटिंग सिस्टम के stat फ़ंक्शन पर कॉल करता है। stat फ़ंक्शन प्रश्न में फ़ाइल के बारे में सभी प्रकार की रोचक जानकारी से भरा संरचना देता है, लेकिन प्रत्येक फ़ाइल टेस्ट ऑपरेटर केवल उस संरचना के फ़ील्ड में से एक को देखता है (क्या यह एक फ़ाइल है? क्या यह एक निर्देशिका है? कितना बड़ा है यह?)

यह आम बात है कि आप अधिक जानना चाहेंगे कि फ़ाइल के बारे में जानकारी का एक टुकड़ा (क्या यह एक फाइल है? क्या मैं इसे पढ़ सकता हूं? क्या मैं इसे निष्पादित कर सकता हूं?) लिखने का मूर्ख तरीका यह है:

if (-f $file and -r $file and -x $file)

लेकिन इससे stat को तीन कॉल stat - उनमें से प्रत्येक केवल संरचना से खेतों में से एक को देखता है। इसे कम करने के लिए, पर्ल चतुर है और सबसे हालिया कॉल के stat को कैश करता है। यह विशेष फाइलहैंड _ खिलाफ कैश किया गया है। तो एक ही कोड लिखने का एक और अधिक प्रभावी तरीका है:

if (-f $file and -r _ and -x _)

यह केवल एक कॉल को stat बनाता है।

पर्ल 5.10 के बाद से, आप "स्टैक्ड फ़ाइल परीक्षण" का भी उपयोग कर सकते हैं और इस कोड को इस प्रकार लिख सकते हैं:

if (-x -r -f $file) # Note reversed order of operators

अद्यतन: perldoc यह ढेर फ़ाइल ऑपरेटरों के बारे में कहते हैं।

पर्ल 5.10.0 के रूप में, पूरी तरह से वाक्य रचनात्मक चीनी के रूप में, आप फ़ाइल टेस्ट ऑपरेटरों को इस तरह से ढेर कर सकते हैं कि -f -w -x $file "-x $file && -w _ && -f _ बराबर है (यह केवल फैंसी सिंटैक्स है: यदि आप किसी -f $file ऑपरेटर को तर्क के रूप में -f $file के वापसी मान का उपयोग करते हैं, तो कोई विशेष जादू नहीं होगा।)







perl