Perl sub возвращает подпрограмму - PullRequest
0 голосов
/ 27 апреля 2020

Я не использовал Perl около 20 лет, и это меня смущает. Я получил ****** для этого, но, очевидно, я не использовал подходящую строку поиска, потому что я не нашел ничего, относящегося к этому ...

Зачем мне это делать? последующий? Я понимаю, что он делает, но «почему» ускользает от меня. Почему бы просто не вернуть 0 или 1 для начала?

Я работаю над кодом, в котором подпрограмма использует "возврат подпрограммы"; вот очень усеченный пример, например

sub test1 {
  $a = shift @_;

  if ($a eq "cat") {
    return sub {
      print("cat test OK\n");
      return 0;
      }
  }
# default if "cat" wasn't the argument
  return sub {
    print("test for cat did not work\n");
    return 1;
    }
}

$c = test1("cat");
print ("received: $c\n");
print ("value is: ",&$c,"\n");

$c = test1("bat");
print ("received: $c\n");
print ("value is: ",&$c,"\n");

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Возможно, вы хотите выполнить поиск "perl замыканий".

Существует множество причин, по которым вы хотите вернуть ссылку на код, но я не могу ответить на этот вопрос в вопросе StackOverflow. Высший Порядок Марка Джейсона Доминуса Perl - это хороший способ расширить свой кругозор, и мы немного расскажем об этом в Промежуточное звено Perl.

Я написал File :: Find :: Closures , чтобы продемонстрировать это классом. Каждая подпрограмма в этом модуле возвращает две ссылки на код - одну для обратного вызова на File::Find, а другую - для доступа к результатам. Они имеют общую переменную, к которой больше никто не может получить доступ.

Обратите внимание, что в вашем случае вы просто не вызываете подпрограмму, чтобы "получить ноль". Это делает другие вещи. Даже в вашем простом примере есть какой-то вывод. Затем некоторое поведение откладывается до тех пор, пока вы на самом деле не используете результат для чего-либо.

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

1 голос
/ 27 апреля 2020

В вашем коде нет причин возвращать саб. Однако, с небольшим изменением

sub test1 {
    my $animal = shift @_;

    if ($animal eq "cat"  || $animal eq "dog") {
        return sub {
            print("$animal test OK\n");
            return 0;
        };
    }

    # default if "cat" or "dog" wasn't the argument
    return sub {
        print("test for cat or dog did not work\n");
        return 1;
    };
}

Теперь у нас есть замыкание около $animal, это экономит память, поскольку тесты для кошек и собак используют один и тот же код. Обратите внимание, что это работает только с моими переменными. Также обратите внимание, что $ a и $ b немного отличаются от Perl, они используются в блоке кода, который вы можете передать в функцию сортировки и пропустить некоторые проверки видимости, поэтому лучше избегать их ни для чего, кроме сортировки. .

...