В вашей строке $test_condition->()
вы вызываете подпрограмму, но не передаете ей никаких аргументов.Скорее всего, вы имели в виду $test_condition->($self)
или, возможно, $self->$test_condition
Вот рефакторинг вашего кода, исправляющий несколько других проблем:
sub get_flag_end {
my $self = shift;
return -e $self->{file}; # no need to quote the variable
}
sub wait_for_end {
my ($self, $timeout, $poll_interval) = @_; # unpack many args at once
unless ( $self->timeout( $timeout, $poll_interval, $self->can('get_flag_end') ) ) {
die "!!!ERROR!!! Timed out while waiting for wait_for_end: timeout=$timeout, poll_interval=$poll_interval \n";
}
}
sub timeout {
my ($self, $timeout, $poll_interval, $test_condition) = @_;
until ($self->$test_condition || $timeout <= 0) {
$timeout -= $poll_interval;
sleep $poll_interval;
}
return $timeout > 0; # condition was met before timeout
}
В зависимости от остальных вашихреализация, создание подпрограммы, которая знает, что ее invocant может быть лучше.Вы можете сделать это в Perl с закрытием:
unless ( $self->timeout( $timeout, $poll_interval, sub {$self->get_flag_end} )){
Здесь создается новая подпрограмма, которая запоминает значение $self
.Вы бы назвали это без аргументов $test_condition->()