2015-02-18 7 views
5

क्या फ़ंक्शन के लिए आवश्यक पैरामीटर की सूची का अनुरोध करने के लिए कोई सम्मेलन है? मैं एक सबराउटिन को कॉल करने में सक्षम होना चाहता हूं जो मुझे बताएगा कि मुझे @repeat को कॉल करते समय $ वाक्यांश और $ बार प्रदान करने की आवश्यकता है।perl वांछित पैरामीटर की सूची प्राप्त करें

use strict; 
use warnings; 

sub repeat { 
    my $phrase = shift; 
    my $times = shift; 
    return $phrase x $times; 
    } 
+0

मुझे लगता है कि यह आपकी पहली वाक्य का अजीब शब्द था जो लोगों को गुमराह करता था। यह तब तक नहीं था जब तक आपने मेरे जवाब पर टिप्पणी नहीं की कि हमें एहसास हुआ कि आप वास्तव में एक सबराउटिन के प्रोटोटाइप को निर्धारित करने का एक तरीका चाहते हैं। यह तब तक करना एक अजीब बात है जब तक आप एक आईडीई या कुछ इसी तरह लिख नहीं लेते। क्या आप इसके लिए अपने कारण बताएंगे, क्योंकि एक बेहतर समाधान भी हो सकता है। मानक पर्ल 5 में पहली जगह प्रोटोटाइप नहीं है इसलिए लाने के लिए कुछ भी नहीं है। आप एक अलग भाषा का उपयोग कर बेहतर हो सकते हैं। – Borodin

+0

धन्यवाद, यह अच्छी प्रतिक्रिया है और मैं खराब वाक्यांश प्रश्न के लिए क्षमा चाहता हूं। मेरा उपयोग केस किसी फ़ंक्शन का चयन करने के बाद वेब पेज पर गतिशील रूप से आवश्यक पैरामीटर प्रदर्शित करना है। फंक्शन :: पैरामीटर्स का स्वीकार्य उत्तर वही है जो मैं ढूंढ रहा था। – nando

उत्तर

4

आप आत्मनिरीक्षण के लिए पूछ रहे हैं। ओओ ढांचे के बहुत सारे हैं जो इसे प्रदान करते हैं (उदा। Moose)। लेकिन, यदि आप फ़ंक्शन घोषित करने में सक्षम होना चाहते हैं और फिर इसे अपने प्रोग्राम के भीतर से जांचें, Function::Parameters जाने का एक उचित तरीका है।

Function::Parameters::Info सार से:

use Function::Parameters; 

    fun foo($x, $y, :$hello, :$world = undef) {} 

    my $info = Function::Parameters::info \&foo; 
    my $p0 = $info->invocant;    # undef 
    my @p1 = $info->positional_required; # ('$x', '$y') 
    my @p2 = $info->positional_optional; #() 
    my @p3 = $info->named_required;  # ('$hello') 
    my @p4 = $info->named_optional;  # ('$world') 
    my $p5 = $info->slurpy;    # undef 
    my $min = $info->args_min; # 4 
    my $max = $info->args_max; # inf 

    my $invocant = Function::Parameters::info(method() { 42 })->invocant; # '$self' 

    my $slurpy = Function::Parameters::info(fun {})->slurpy; # '@_' 

:: जानकारी मॉड्यूल वास्तव में मूस का उपयोग कर कार्यान्वित किया जाता है में आत्मनिरीक्षण सुविधा।

+0

धन्यवाद। मैं बाद में कोशिश करूंगा। एफवाईआई, मैंने "पर्ल आत्मनिरीक्षण" की खोज की और मुझे अच्छे नतीजे नहीं मिले, लेकिन यह ठीक से हुआ जो मैं करना चाहता था (लेकिन गलत भाषा में) >>> myfunc def (arg1, arg2, arg3 = ' toto ', * args, ** kw): पास करें ... >>> आयात निरीक्षण >>> निरीक्षण करें।Getargspec (myfunc) (['arg1', 'arg2', 'arg3'], 'args', 'kw', ('toto',)) – nando

+0

आप पर्ल 6 के लिए भी प्रतीक्षा कर सकते हैं, या श्वार्न की कोशिश कर सकते हैं [पर्ल 5i ] (http://search.cpan.org/~mschwern/perl5i-v2.13.1/)। पर्ल 5 बस बॉक्स के बाहर ओओ तकनीकों के इस तरह के लिए खुद को उधार नहीं देता है - और यह ठीक है। –

6

बेशक, आप अपनी आवश्यकताओं के आधार पर स्वयं द्वारा कुछ नियंत्रण तंत्र बना सकते हैं। लेकिन subroutine हस्ताक्षर के साथ आपकी मदद करने के लिए कुछ मॉड्यूल हैं। ,

  1. signatures, सरल
  2. Kavorka प्रकार की जाँच
  3. Method::Signatures OO तरीकों
+0

ऐसा लगता है कि मुझे करीब आता है। स्पष्टीकरण के लिए, क्या उप सब का निरीक्षण करने और वांछित पैरामीटर की एक सूची वापस करने का कोई तरीका है? हस्ताक्षर और पैरामीटर पहले से प्रदान किए गए पैरामीटर को संभालने के तरीके प्रतीत होते हैं। ऐसा लगता है कि विशेषता :: हस्ताक्षर (जो मैंने आपके उत्तर के माध्यम से पाया) आपको "सबराउटिन के लिए कॉल हस्ताक्षर परिभाषित करने" की अनुमति देता है, जो मुझे लगता है कि मैं क्या देख रहा हूं। – nando

+0

@ बेन ग्रिम ने संदर्भित किया [फंक्शन :: पैरामीटर] (https://metacpan.org/pod/Function:: पैरामीटर) निरीक्षण के लिए समाधान हो सकता है? –

2

मेरी राय में, इस सवाल का सबसे अच्छा समाधान करने के लिए है के लिए के साथ: मैं उनमें से 3 की पेशकश करेगा Perl6::Parameters का उपयोग करें, जैसा कि इसके नाम से पता चलता है, एक स्रोत फ़िल्टर का उपयोग करने के डरावनी के बिना पर्ल 6 के अर्थशास्त्र को अनुकरण करता है।

+0

यह वादा करता है। प्रोटोटाइप (फ़ंक्शन) को कॉल करने जैसी कुछ करने से मुझे नामित पैरामीटर वापस मिलेंगे? यदि ऐसा है, तो यह मेरे प्रश्न का उत्तर देता है। – nando

+0

मैंने सुझाए गए इन तीन मॉड्यूल में स्रोत फ़िल्टर का भी उपयोग नहीं किया है, AFAIK। पॉइंटर के लिए –

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