Я пытаюсь передать подпрограмму другой подпрограмме в модуле Perl. Но когда я передаю вспомогательную ссылку, переданная ссылка больше не имеет данных объекта. Может быть, это невозможно сделать таким образом. Строка, о которой у меня есть вопрос, - это строки «если» ниже:
sub get_flag_end {
my $self = shift;
return ( -e "$self->{file}" );
}
sub wait_for_end {
my $self = shift;
my $timeout = shift;
my $poll_interval = shift;
# Is it even possible to pass the oject subroutine and retain the objects data?
#unless ( $self->timeout( $timeout, $poll_interval, $self->get_flag_end ) ) { # does not work
unless ( $self->timeout( $timeout, $poll_interval, \&get_flag_end ) ) { # call happens but members are empty
die "!!!ERROR!!! Timed out while waiting for wait_for_end: timeout=$timeout, poll_interval=$poll_interval \n";
}
}
sub timeout {
my $self = shift;
my $timeout = shift;
my $poll_interval = shift;
my $test_condition = shift;
until ($test_condition->() || $timeout <= 0) {
$timeout -= $poll_interval;
sleep $poll_interval;
}
return $timeout > 0; # condition was met before timeout
}
Я знаю, что мог бы изменить подпрограмму "get_flag_end", чтобы она принимала значение в качестве аргумента подпрограммы, но что, если бы в "get_flag_end" была сделана куча вещей, и мне нужно было больше членов от объекта. Я немного упростил код, чтобы за ним было легче следить.