рекурсивные структуры в Perl

perl

79 просмотра

1 ответ

645 Репутация автора

В коде Perl я должен вызвать lsфункцию и проверить, есть ли там ребенок. Затем я должен снова вызвать ту же функцию, в противном случае выполнить какое-то действие.

Например

# call ls Method

sub check_ls {

    $folder = $foo->ls();
    $length = @listing;

    if ( $length > 1 ) {

        #do something
    }
    elsif ( $length == 1 ) {
        check_ls();
    }
}

==================================================

   Question-2: 

Может ли кто-нибудь описать / отредактировать мой код ниже (И я хочу знать поток структуры ниже)

my $foo=cms::folder_entry->new(); #create a new object of folder_entry class
$root_entry_id =$foo->new_root_folder(folder_name=>'test_root_timestamp'); #now i call the new_root_folder and in return i got the id
my $root = folder_entry_id->new($root_entry_id); #now again create a new object through passing $root_entry_id parameter

или приведенное ниже утверждение является правильным?

  my @listing = $root->$foo->ls();

Пожалуйста, измените мой комментарий, если я ошибаюсь в вопросе secound

Автор: Dhruv Tyagi Источник Размещён: 19.07.2016 07:18

Ответы (1)


2 плюса

45307 Репутация автора

Решение

Это совершенно правильный подход. Это называется рекурсия и часто используется для обхода древовидных структур.

Важно включить условие, которое завершит рекурсию.

Однако ваш код выглядит так, как будто он не будет работать. Вы используете глобальные переменные. Вы должны использовать лексических объявляются с использованием в myключевых словах внутри вашей функции, и вы должны пройти в текущем состоянии в рекурсию.

Рассмотрим этот пример расчета факториалов.

sub fac {
    my $number = shift;

    return 1 if $number == 1;
    return $number * fac($number - 1);
}

print fac(5);

Он пройдет весь путь до рекурсии до самого глубокого уровня. Затем он вычислит назад дерево рекурсии. При каждом вызове лексические переменные будут ограничены, чтобы они не конфликтовали и не перезаписывались.

Посмотрите на это переписать с выводом отладки.

sub fac {
    my $number = shift;

    print "in: $number\n";

    return 1 if $number == 1;

    my $return = $number * fac($number - 1);
    print "out: $return\n";

    return $return;
}


print fac(5);

Вот выход.

in: 5
in: 4
in: 3
in: 2
in: 1
out: 2
out: 6
out: 24
out: 120
120

Если запустить Perl , который по крайней мере , версия 5.16, вы можете использовать в __SUB__ключевое слово вместо имени вашего суб внутри той же суб. Возвращает ссылку на текущую подпрограмму. Таким образом, вы даже можете создавать рекурсивные анонимные подпрограммы. Вы должны включить его use feature 'current_sub'или use v5.16хотя.

use feature 'current_sub';

sub fac {
    my $number = shift;

    print "in: $number\n";

    return 1 if $number == 1;

    my $return = $number * __SUB__->($number - 1);
    print "out: $return\n";

    return $return;
}

Кроме того, добавьте и прагмами в код , чтобы применять более строгие правила , которые упрощают отладку кода.use strictuse warnings 'all'

Автор: simbabque Размещён: 19.07.2016 08:03
Вопросы из категории :
32x32