if (-f <filename>) { ... }
ऐसा लगता है कि या तो मैं सवाल गलत समझा है, वरना अन्य सभी को है।
सबसे पहले, आइए कुछ धारणाएं करें।
मान लें कि आप सभी -X
उपसर्ग एकल ऑपरेटरों (यह या तो है उन्हें या उनमें से कोई भी के सभी),
चलो यह भी मान लें कि आप <>
circumfix अतिभारित नहीं किया है अतिभारित नहीं किया करते हैं पुनरावृत्ति ऑपरेटर।
यह मानते हुए कि ऊपर दिए गए उन दो गिवेंस के दोनों shoul रखें, फिर अंकन <filename>
करना होगा एक scalar readline(*filename)
- जो $/
के मूल्य पर निर्भर करता है - और फिर उस परिणाम वापस filetest ऑपरेटर के लिए बाद में मूल्यांकन के लिए गुजरती हैं, आमतौर पर स्टेट (2) के माध्यम से आवश्यक नहीं है। इसका मतलब है कि आपके पास काम करने के लिए filename
के नाम से एक फ़ाइल हैंडल खोलने के लिए सबसे अच्छा था, जब तक कि वास्तव में गहरी जादूगर शामिल न हो।
यदि यह <$filename>
के लिए भी ऐसा करेगा, तो अब $filename
filename
जैसे प्रत्यक्ष व्यक्ति के बजाय एक अप्रत्यक्ष हैंडल है। फिर, $/
सम्मानित है। इसके साथ जुड़े फ़ाइलहेडल के लिए उचित फ़ाइल नाम का उपयोग करना वास्तव में कुछ है जो मैं करता हूं। उदाहरण के लिए:
our $fn = "/etc/termcap";
open($fn, "<", $fn) || die "can't open $fn: $!";
इस तरह warn
और die
संदेशों वास्तव में मुझे फ़ाइल का नाम बताओ। उदाहरण के लिए:
while (<$fh>) {
warn "oops" if whatever;
}
मुझे लाइन नंबर और फ़ाइल का नाम बताएगा जिस पर मैंने ओपस्टेड किया था।
अब, यदि <⋯>
का ऑपरेंड अनब्रेस्ड डाइटिव ऑब्जेक्ट्स के लिए नियमों से विचलित हो जाता है, यानी शून्य या अधिक डॉलर के संकेतों से उपसर्ग किया गया है, तो यह पुनरावृत्ति ऑपरेटर नहीं है लेकिन वाइल्डकार्ड burster। यह वाइल्डकार्ड के बिना भी सच है। यह सिर्फ Datives के पर्ल के प्रसिद्ध नियम का उल्लंघन है, और है कि तब वैकल्पिक
इसका मतलब यह है चलाता है कि यदि और केवल यदिfilename
शून्य या अधिक अग्रणी डॉलर चिह्न के साथ एक कानूनी bareword नहीं है - इस तरह के लिए के रूप में उदाहरण /etc/termcap
, /tmp
, *.[Cchy]
, {,/usr}/bin/c?
, या ~/Documents
- तो File::Glob::bsd_glob
समारोह के गाइड में है कि परिचित वर्ष conglobulation ऑपरेटर के बजाय कहा जाता है, के साथ वास्तव में परिणाम की तरह आप जब साथ आपूर्ति की इस तरह के एक उपयोगी और आमतौर पर इस्तेमाल किया समारोह की उम्मीद होती है उचित तर्क
use v5.10; # for the say feature, but not needed for conglobulation
if (-d <~joebob> ) { say "joebob has a home" }
if (-d <~joebob/.opera> ) { say "joebob has an opera directory" }
if (-d <~joebob/.ssh> ) { say "joebob has an ssh directory" }
if ($n = grep {-e} <~joebob/.*rc>) { say "joebob has $n RC files" }
if (-f <~joebob/.exrc> ) { say "joebob has a vi config file" }
if (-f <~joebob/.profile> ) { say "joebob has a sh profile" }
if (-f <~joebob/.bashrc> ) { say "joebob has a bash config script" }
if (-f <~joebob/.cshrc> ) { say "joebob has a csh config script" }
if (-f <~joebob/.log{in,out}*> ) { say "joebob has csh login/out scripts" }
if (-S </tmp/.X*/X*> ) { say "I smell an X11 socket" }
if (-t STDIN && -t STDOUT ) { say "smells pretty tty to me" }
'-f' विकल्प नहीं बल्कि अजीब है:
यहाँ कई उदाहरण है कि प्रश्न की तरह दिखाने के लिए जवाब उद्धृत भाग से ऊपर वास्तव में पूछ रहा है कर रहे हैं। अस्तित्व के लिए परीक्षण '-e' है, लेकिन '-f'" सादा फ़ाइल "है, जिसे" विशेष नहीं "के रूप में परिभाषित किया गया है। यह द्विआधारी नहीं है, क्योंकि मेरे परीक्षणों में, एक फ़ाइल '-B' और '-f' दोनों के लिए सच होती है। – TLP
यहां सीखा जाने वाला सबक सामान्य Google परिणामों पर निर्भर नहीं है। [डोमेन 'perl.org'] पर प्रतिबंधित करें (http://google.com/search?q=site%3Aperl.org+%2Bf): दूसरा परिणाम वह है जो आप के बाद थे। - यदि आपकी किताब '-f' का उल्लेख नहीं करती है तो आपकी किताबें बेकार हो सकती हैं। उनको बेहतर बनाएं: और स्टैक ओवरफ़्लो पर कुछ अच्छी अनुशंसाएं भी हैं, टैग '[perl] '' [books] खोजें '। –
daxim
'-f' उस पुरानी परिचित बचना के लिए सिंटैक्टिक चीनी के अलावा कुछ भी नहीं है, '(statbuf.st_mode और S_IFMT) == S_IFREG'। यहां ऑपरेटिव सवाल वास्तव में '' है, और यह बहुत अधिक दिलचस्प है। –
tchrist