2015-02-18 17 views
5

Bir işlev için gerekli parametrelerin listesini istemek için bir sözleşme var mı? @repeat çağırırken $ ifade ve $ times vermem gerektiğini söyleyen bir altprogramı aramak istiyorum.perl istenilen parametrelerin listesini al

use strict; 
use warnings; 

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

Sanırım ilk cümlenin insanları yanlış yönlendiren garip bir ifadesiydi. Cevabım üzerine bir altprogramın prototipini belirlemenin bir yolunu gerçekten istediğini anladığımızı anlayana kadar değildi. IDE ya da benzer bir şey yazmıyorsanız yapmak istediğiniz garip bir şey. Bunun nedenlerini açıklar mısınız, çünkü daha iyi bir çözüm olabilir. Standart Perl 5'in ilk etapta prototipleri yok, böylece getirilecek hiçbir şey yok. Farklı bir dil kullanarak daha iyi olabilirsiniz. – Borodin

+0

Teşekkürler, bu iyi bir geri bildirim ve yanlış ifade edilen soru için özür dilerim. Benim kullanım durumum, bir işlev seçildikten sonra web sayfasında istenen adlandırılmış parametreleri dinamik olarak görüntülemek. Fonksiyon :: Parametrelerin kabul edilen cevabı tam olarak aradığım şeydir. – nando

cevap

4

iç gözlemi için soruyorsunuz. Bunu sağlayan birçok OO çerçevesi vardır (ör. Moose). Ancak, işlevinin işlevini bildirmek ve daha sonra programınızın içinden incelemek istiyorsanız, Function::Parameters gitmek için makul bir yoldur. Function::Parameters::Info Sinopsis itibaren

:

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; # '@_' 

aslında Moose kullanılarak uygulanır :: Bilgi modülünde içgözlem özelliği.

+0

İşaretçi için teşekkürler. Bunu daha sonra deneyeceğim. FYI, "perl introspection" aradım ve mükemmel sonuçlar almadım, ama ben tam olarak ne yapmak istediğimi (ama yanlış dilde) bu karşılaşma karşılaştım >>> def myfunc (arg1, arg2, arg3 = ' toto ', * args, ** kw): ... >>> ithalat incelemesi >>> kontrol edin.getargspec (myfunc) (['arg1', 'arg2', 'arg3'], 'args', 'kw', ('toto',)) – nando

+0

Ayrıca Perl 6 için bekleyebilir veya Schwern'in [Perl 5i] ] (http://search.cpan.org/~mschwern/perl5i-v2.13.1/). Perl 5 kendini kutudan çıkan bu OO teknikleriyle ödünç vermez - ve sorun değil. –

6

Elbette, ihtiyaçlarınıza bağlı olarak bazı kontrol mekanizmalarını kendiniz oluşturabilirsiniz. Ama alt rutin imzaları ile size yardımcı olacak bazı modüller var. 3 tanesi sunacak:

  1. signatures, en basit
  2. Kavorka yazın Bence
+0

Bu bana daha yakın görünüyor. Açıklığa kavuşturmak için, bir alt denetlemek ve istenen parametrelerin listesini döndürmek için herhangi bir yolu var mı? İmzalar ve parametreler zaten sağladığım parametreleri ele alma yolları gibi görünüyor. Attribute :: Signature (cevabınız aracılığıyla bulduğum) gibi görünüyor, aradığım şey olduğunu düşündüğüm "altprogramlar için bir çağrı imzası tanımlamanıza" olanak tanır. – nando

+0

@Ben Grimm, [Function :: Parameters] (https://metacpan.org/pod/Function::Parameters) tarafından incelenerek, inceleme için çözüm olabilir mi? –

2

, bu soruya en iyi çözüm olduğunu OO yöntemleri için

  • Method::Signatures kontrol ile Adından da anlaşılacağı gibi, kaynağı olmadan bir kaynak süzgecisi kullanmanın dehşeti olmadan Perl 6 'un anlamını öykünen kullanın.

  • +0

    Bu umut verici görünüyor. Prototip (işlev) çağırmak gibi bir şey yapmak bana adlandırılan parametreleri geri verir mi? Eğer öyleyse, bu sorumu cevaplar. – nando

    +0

    Önerdiğim bu üç modülde kaynak filtreleri de yok, AFAIK. –

    İlgili konular