#!/usr/bin/perl use strict; use warnings; use IO::Async::Loop; use IO::Async::Timer::Periodic; use IO::Async::Handle; use Term::ReadLine 1.09; use File::Basename; use lib dirname($0) . '/lib'; use ExampleHelpers qw( initialize_completion update_time print_input ); my $loop = IO::Async::Loop->new; $loop->add( IO::Async::Timer::Periodic->new( interval => 1, on_tick => \&update_time, )->start ); my $term = Term::ReadLine->new('...'); initialize_completion($term); my $watcher; $term->event_loop( sub { # This callback is called every time T::RL wants to # read something from its input. The parameter is # the return from the other callback. my $ready = shift; $$ready = 0; $loop->loop_once while !$$ready; }, sub { # This callback is called as the T::RL is starting up # readline the first time. The parameter is the file # handle that we need to monitor. The return value # is used as input to the previous callback. my $fh = shift; # The data for IO::Async is just the ready flag. To # ensure we're referring to the same value, this is # a SCALAR ref. my $ready = \ do{my $dummy}; $loop->add( $watcher = IO::Async::Handle->new( read_handle => $fh, on_read_ready => sub { $$ready = 1 }, ) ); $ready; } ); my $input = $term->readline('> '); # clean up by removing the watcher. $loop->remove($watcher); print_input($input);