The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl
# vim: ts=2 sw=2 noexpandtab

use strict;
use warnings;
use feature qw( say );

use Socket qw( AF_INET unpack_sockaddr_in inet_ntoa );
use Socket::GetAddrInfo qw( :newapi getaddrinfo );

sub format_addr {
	my ($port, $inaddr) = unpack_sockaddr_in $_[0];
	sprintf "%s:%d", inet_ntoa($inaddr), $port;
}

use POE qw( Session Kernel Wheel::ReadWrite Wheel::Run Filter::Reference );

{
	my $wheel_resolver;

	POE::Session->create(
		inline_states => {
			_start => sub {
				$wheel_resolver = POE::Wheel::Run->new(
					Program => sub {
						my ($err, @addrs) =
							getaddrinfo("localhost", "www", {family => AF_INET});
						die "$err" if $err;
						print @{POE::Filter::Reference->new->put([$addrs[0]])};
					},
					StdoutFilter => POE::Filter::Reference->new,
					StdoutEvent  => 'resolver_input',
					StderrEvent  => 'resolver_error',
				);
			},

			resolver_input =>
				sub { say "POE resolved " . format_addr($_[ARG0]->{addr}) },
			resolver_error => sub { say "POE resolver error $_[ARG0]" },
		},
	);
}

POE::Kernel->run;