2011-08-23 13 views
14

मैं Beginning Perl पढ़ रहा हूँ साइमन Cozens द्वारा और में अध्याय 8 - सबरूटीन्स वह कहता है कि "सबरूटीन्स", उपयोगकर्ता कार्य हैं, जबकि print, open, split, आदि में निर्मित ऑपरेटर या कार्यों कर रहे हैं।पर्ल अंतर्निहित ऑपरेटरों/कार्यों क्या हैं?

वे क्या हैं? क्या वे वास्तव में अंतर्निहित, भाषा-आंतरिक विशेषताएं (जैसे सी के sizeof ऑपरेटर) हैं या वे वास्तव में main मॉड्यूल के उपरोक्त/कार्य हैं?

यदि वे subroutines हैं, while, for, unless, आदि भी subroutines हैं? +, -, eq आदि जैसे ऑपरेटरों के बारे में क्या?

+3

मैं 'perldoc perlfunc' और' perldoc -f 'देखता हूं। –

+1

यह पर्ल ऑपरेटरों की मेरी पसंदीदा सूची है: http://www.ozonehouse.com/mark/periodic/ – Seth

+1

@ सेठ यह पर्ल 6 के लिए है, जो (सभी उद्देश्यों और उद्देश्यों के लिए) पर्ल 5 से पूरी तरह से अलग भाषा है, जो जब वे "पर्ल" कहते हैं तो बस हर किसी के बारे में क्या मतलब है। – jwodder

उत्तर

25

print, open, split subroutines नहीं हैं। वे उप कॉल में परिणाम नहीं देते हैं। वे प्रतीक तालिका में भी मौजूद नहीं हैं (main:: में या अन्यथा, हालांकि आप उन्हें CORE::split, आदि के रूप में संदर्भित कर सकते हैं), और कोई भी उनके कोड का संदर्भ नहीं प्राप्त कर सकता है (हालांकि CORE:: में उनके लिए प्रॉक्सी सबस बनाने के लिए काम किया जा रहा है जब आप उन्हें subroutines के रूप में व्यवहार करना चाहते हैं)। वे ऑपरेटर हैं जैसे +

$ perl -MO=Concise,-exec -e'sub f {} f()' 
1 <0> enter 
2 <;> nextstate(main 2 -e:1) v:{ 
3 <0> pushmark s 
4 <#> gv[*f] s 
5 <1> entersub[t3] vKS/TARG,1  <--- sub call 
6 <@> leave[1 ref] vKP/REFC 
-e syntax OK 

$ perl -MO=Concise,-exec -e'split /;/' 
1 <0> enter 
2 <;> nextstate(main 1 -e:1) v:{ 
3 </> pushre(/";"/) s/64 
4 <#> gvsv[*_] s 
5 <$> const[IV 0] s 
6 <@> split[t2] vK     <--- not a sub call 
7 <@> leave[1 ref] vKP/REFC 
-e syntax OK 

$ perl -MO=Concise,-exec -e'$x + $y' 
1 <0> enter 
2 <;> nextstate(main 1 -e:1) v:{ 
3 <#> gvsv[*x] s 
4 <#> gvsv[*y] s 
5 <2> add[t3] vK/2     <--- Just like this 
6 <@> leave[1 ref] vKP/REFC 
-e syntax OK 

वे नाम की एक किस्म से जाना जाता है:

  • निर्मित कार्यों
  • कार्यों
  • builtins
  • नामित ऑपरेटरों

और सबसे एक माना जाता है निम्नलिखित में से:

  • सूची ऑपरेटर
  • एकल ऑपरेटर

सबरूटीन्स अक्सर कार्यों कहा जाता है (के रूप में वे C और C++ में हैं) का नाम दिया है, तो "समारोह" एक अस्पष्ट शब्द है। यह अस्पष्टता आपके प्रश्न का आधार प्रतीत होता है।


while का सवाल है, for, unless, आदि, वे "प्रवाह नियंत्रण बयान"

while (f()) { g() } 

और "कथन संशोधक"

g() while f(); 
+1

क्या कोड आपने कोड को पोस्ट किया है कि पर्ल के वीएम समझते हैं, पर्ल दुभाषिया द्वारा उत्पन्न? – Raphael

+0

@ राफेल, हां, वे ओपोड पेड़ों के प्रतिनिधित्व हैं जो कार्यक्रमों को संकलित करने के परिणामस्वरूप हैं। – ikegami

10

पर्ल कीवर्ड वे हैं जो पर्ल स्रोत वितरण में regen/keywords.pl फ़ाइल में परिभाषित हैं। ये हैं:

__FILE__, __LINE__, __PACKAGE__, __DATA__, __END__, AutoLoad, शुरू, UNITCHECK, कोर, नष्ट, अंत, Init, जांच, पेट, स्वीकार करते हैं, अलार्म, और, atan2, बाँध, binmode , आशीर्वाद, ब्रेक, कॉलर, chdir, chmod, चोप्स, काट, चोटी, सीआर, क्रोट, क्लोज़, बंदर, सीएमपी, कनेक्ट, जारी रखें, कॉस, क्रिप्ट, डीबीएमक्लोस, डीबीएमओपेन, डिफ़ॉल्ट, परिभाषित, हटाएं, मरें, डू, डंप, प्रत्येक, अन्य, एल्सिफ़, एंडग्रेंट, एंडहोस्टेंट, एंडनेटेंट, एंडप्रोएंटेंट, एंडपेंट, एंड्रॉवेंट, ईओएफ, ईक, इवल, एक्जिक, मौजूद, बाहर निकलें, एक्सपी, एफसीएनटीएल, फिलीनो, झुंड, फॉरवर्ड, कांटा, प्रारूप, रूपरेखा, जीई, getc, getgrent, getgr gid, getgrnam, gethostbyaddr, गेथोस्टबाइनेम, gethostent, getlogin, getnetbyaddr, getnetbyname, getnetent, getpeername, getpgrp, getppid, getpriority, getprotobyname, getprotobynumber, getprotoent, getpwent, getpwnam, getpwuid, getservbyname, getservbyport, getservent, getsockname, getsockopt, दिए गए, ग्लोब, जीएमटाइम, गोटो, जीआरपी, gt, हेक्स, अगर, इंडेक्स, इंट, आईओक्टएल, शामिल हों, चाबियाँ, मारें, आखिरी, एलसी, एलसीएफस्ट, ली, लम्बाई, लिंक, सुनो, स्थानीय, स्थानीय समय , लॉक, लॉग, lstat, lt, m, map, mkdir, msgctl, msgget, msgrcv, msgsnd, my, ne, next, no, not, oct, open, opendir, या, ord, our, pack, package , पाइप, पॉप, pos, प्रिंट, printf, प्रोटोटाइप, पुश, क्यू, qq, qr, quotemeta, qw, qx, rand, read, readdir, रीडलाइन, रीडलिंक, रीडपाइप, आरईवी, रेडो, रेफ, नाम बदलें, आवश्यकता है, रीसेट करें, रिटर्न करें, रिवर्स, रिवाइंडर, रिंडेक्स, आरएमडीआईआर, एस, कहें, स्केलर, तलाश, तलाशने वाला, चुनें, सेक्स्टल, सेमेज, सेमॉप, भेजें , setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent, setsockopt, पारी, shmctl, shmget, shmread, shmwrite, बंद, पाप, नींद, सॉकेट, socketpair, प्रकार, जोड़, विभाजन, sprintf, sqrt, srand, stat, राज्य, अध्ययन, उप, सबस्ट्र, symlink, syscall, sysopen, sysread, sysseek, system, syswrite, tell, telldir, टाई, बंधे, समय, समय, tr, truncate, uc, ucfirst , umask, undef, जब तक, अनलिंक, अनपैक, unshift, untie, till, use, utime, values, vec, wait, waitpid, wantarray, चेतावनी, कब, जबकि, लिखो, एक्स, xor, वाई।

, perlsyn perlop, और perlsub manpages पढ़ने के लिए आवश्यक हैं, शायद perlfunc मैनपेज द्वारा पीछा किया। वस्तुओं के साथ प्रयुक्त बिल्टिन ऑपरेटरों को ओवरराइड करने के तरीके को जानने के लिए, अधिभार मैनपेज देखें।

+0

उस खोजशब्द के साथ कभी भी एक भाषा नहीं देखी! – Raphael

+0

@ राफेल: फिर कोबोल को न देखें। ;) – musiKk

+3

@ राफेल: आप शायद कुछ ऐसे कीवर्ड के बारे में सोच रहे हैं जिन्हें ओवरराइड नहीं किया जा सकता है, जैसे 'if' और' till'। ** पर्ल में उन बिल्कुल अनियमित कीवर्ड के * बहुत कम * हैं। ** 'regen/keyword.pl' से पर्ल के अधिकांश कीवर्ड वास्तव में तीन तरीकों से एक (या अधिक) के माध्यम से ओवरराइड किए जा सकते हैं: उस नाम के फ़ंक्शन को आयात करके किसी अन्य पैकेज से (जैसे 'chdir' या' open') या अन्यथा या तो टाईंग (जैसे 'चाबियाँ' या 'पॉप') या ऑपरेटर अधिभार (जैसे' प्रिंट', 'cmp', या' qq') के माध्यम से। जिसे समझने के लिए भाषा के साथ अनुभव की आवश्यकता होती है। – tchrist

1

द्वारा इस्तेमाल किया कीवर्ड हैं में निर्मित ऑपरेटरों पर्ल subroutines नहीं हैं। उदाहरण के लिए,

#!/usr/bin/perl 

use strict; 
use warnings; 

sub Foo { print "In foo\n"; } 

my $ref; 

$ref = \&Foo; 
$ref->(); 

$ref = \&print; 
$ref->(); 

पहला $ref->(); एक अप्रत्यक्ष कॉल है; यह "फू में" प्रिंट करता है।

दूसरा एक एक चेतावनी का उत्पादन:

क्योंकि
Undefined subroutine &main::print called at ./tmp.pl line 14 

print एक सबरूटीन का नाम नहीं है।

+1

fyi, '\ & CORE :: buildin' 5.16 में जोड़ा जा रहा है। यह एक उप-ऑटोवॉइव को सक्रिय करेगा जो बिल्टिन को कॉल करता है। – ikegami

0

बस "अंतर्निहित फ़ंक्शंस" के बारे में सोचें जो आपने नहीं बनाए थे। आसान सही है? :-)

+6

सिवाय इसके कि आप उनका संदर्भ नहीं ले सकते हैं। सिवाय इसके कि आप '&' के साथ कॉल को उपसर्ग करके अपने प्रोटोटाइप और विशेष पार्सिंग नियमों को ओवरराइड नहीं कर सकते हैं। सिवाय इसके कि आप उन्हें 'मिल नहीं' सकते हैं। (और मुझे यकीन है कि मैं कुछ याद कर रहा हूँ) – ikegami

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