2009-10-28 7 views
5

मुझे नहीं लगता कि निम्नलिखित काम करना चाहिए, लेकिन यह करता है:क्या पर्ल हीरा ऑपरेटर गैर-जादू सरणी (@ARGV नहीं) पर फिर से चलाता है?

$ perl -e '@a = qw/1222 2 3/; while (<@a>) { print $_ ."\n";}' 
1222 
2 
3 
$ 

जहाँ तक मुझे पता है, पर्ल के <> ऑपरेटर शाब्दिक <> के अपवाद के साथ, इतने पर filehandle, globs पर और काम shoud (<FILEHANDLE> के बजाय), जो जादुई रूप से @ARGV से अधिक होता है।

क्या किसी को पता है कि यह मेरे परीक्षण में किए गए काम के रूप में भी काम करता है?

+0

पेर्लॉप (1) से <> और @ARGV: यह कहता है कि यह कैसे काम करता है: पहली बार <> मूल्यांकन किया जाता है, @ARGV सरणी की जांच की जाती है, और यदि यह खाली है, तो $ ARGV [0] सेट है "-", जो खोले जाने पर आपको मानक इनपुट देता है। @ARGV सरणी को फिर फ़ाइल नामों की सूची के रूप में संसाधित किया जाता है। मैं अपने @ ए के साथ कुछ ऐसा ही देख सकता हूं, हालांकि ऐसा लगता है कि यह हर सरणी के साथ नहीं होना चाहिए (और मुझे पता है कि फोरच या मानचित्र प्रोसेसिंग एरे के बारे में जाने के बेहतर तरीके हैं)। मैं अभी भी जानना चाहता हूं कि कोड –

उत्तर

10

काम पर जादू!

से 'perldoc perlop':

यदि कोण कोष्ठक के भीतर है न तो एक filehandle है और न ही एक सरल अदिश चर एक filehandle नाम वाले, typeglob, या typeglob संदर्भ में, यह एक फ़ाइल नाम पैटर्न होने के लिए के रूप में व्याख्या कर रहा है globbed, और या तो फ़ाइल नामों की सूची या अगले सूची में फ़ाइल नाम संदर्भ के आधार पर लौटा दिया गया है।

यह नियम है कि आप इस कोड के साथ ट्रिगर कर रहे हैं। यहाँ क्या हो रहा है है:

  1. < @a> (संकलन समय पर, वाक्य रचना) एक glob विस्तार
  2. इस प्रकार <> स्ट्रिंग "1222 2 3" (स्ट्रिंग के प्रक्षेप में @a बदल जाता है होने के लिए निर्धारित एक सरणी)
  3. glob ("1222 2 3") सूची संदर्भ रिटर्न में ('1222', '2', '3')
+0

ठीक है, तो मैं अभी उठ गया, लेकिन मुझे बस # 3 नहीं मिला। – innaM

+0

व्यवहार यह है: जब तक कि इसके तर्क में पैटर्न मिलान मेटाएक्टएक्टर्स न हों, ग्लोब फाइल सिस्टम पर जाने से परेशान नहीं होता है। यह आश्चर्यजनक हो सकता है। यह मुझे शैल ग्लोब कार्यक्षमता के संदर्भ में इसके बारे में सोचने में मदद करता है, जो कि पर्ल के ग्लोब का अनुकरण करना है: यदि आप 'बिल्ली फू' कहते हैं, तो शैल 'foo' के तर्क के साथ 'बिल्ली' को आमंत्रित करता है, भले ही 'foo' मौजूद। यदि आप 'बिल्ली foo। *' कहते हैं, तो शैल वैरिएबल तर्कों के साथ 'बिल्ली' को कॉल करेगा, इस पर निर्भर करता है कि (यदि कुछ भी) पैटर्न से मेल खाता है। – dlowe

+0

धन्यवाद! अब मैं समझ गया। – innaM

-1

<FH> फ़ाइलहेडल का नाम नहीं है, लेकिन एक कोण ऑपरेटर जो हैंडल पर लाइन-इनपुट ऑपरेशन करता है। इस भ्रम को आम तौर पर प्रकट होता है, जब लोग कोण ऑपरेटर "को प्रिंट करने का प्रयास - Programming Perl

तो अपने मामले में सरणी एक हैंडल, जो के जवाब में समझ में आता है, और इस पर इस प्रकार ऑपरेटर दोहराता तो है आपके। प्रश्न, हाँ, मुझे लगता है कि यह मानक है (लेकिन अस्पष्ट) पर्ल। यह अस्पष्ट है क्योंकि भाषा में सरणी को फिर से चलाने के लिए और अधिक स्पष्ट तरीके हैं।

पीएस हालांकि, इसके लिए धन्यवाद, कोड गोल्फ प्रतियोगिताओं के लिए यह बहुत अच्छा होगा

+0

कोड में बिना घुसपैठ किए क्यों किताबों की अनधिकृत प्रतियों के लिंक पोस्ट न करें। –

+0

ओह, मुझे भी एहसास नहीं हुआ।उस के लिए खेद है। –

+1

foreach (@a) बस के रूप में छोटा और आसान है (<@a>), इसलिए यह कोड गोल्फ में ज्यादा मदद नहीं करता है। –

संबंधित मुद्दे