Как объявить функцию и использовать ее рекурсивно без "слишком раннего вызова для проверки прототипа" - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть универсальная и рекурсивная функция, но почему она не авторизована в perl

sub pv($) {
    my ($vars) = @_;
    if(ref($vars) eq 'SNMP::Varbind') {
        return $vars->tag() . (defined($vars->iid()) ? '.' . $vars->iid() : '');
    } elsif (ref($vars) eq 'SNMP::VarList') {
        return join(', ', map { pv($_) } @$vars);
    } elsif(ref($vars) eq 'ARRAY') {
        return join('.', @{$vars});
    } else {
        return $vars;
    }
}

Этот код ошибки "pv () вызван слишком рано для проверки прототипа" для этой строки return join (',', map {pv ($ _)} @ $ vars);

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

В Perl 5.16+ вы можете использовать функцию current_sub :

use strict;
use warnings;
use feature 'current_sub';

sub pv($) {
  ...
  __SUB__->($_)
  ...
}

Это более полезно при использовании анонимных подпрограмм, поэтому вы не создаете цикл памяти (поскольку он закрывает ссылку на себя, это не происходит с именованными подпрограммами, поскольку он просто ищет символ).

Кроме того, рассмотрите возможность не использовать прототип.Весьма вероятно, что вам это не нужно, если вы не знаете, зачем вам это нужно;прототипы предназначены для парсера, а не для вызывающего.Без прототипа достаточно вызвать его в круглых скобках, чтобы задержать поиск символа.

0 голосов
/ 04 февраля 2019

Простой: предварительная декларация

sub pv($);
sub pv($) {
...