#!/usr/bin/env perl
use 5.016;
use autodie;
use warnings;
our $VERSION = 'v.0.0.1';
say qx[/bin/ls];
exit 0;
__END__
####
$ perlcritic -1 syscall1.pl
Backtick operator used at line 8, column 5. Use IPC::Open3 instead. (Severity: 3)
####
#!/usr/bin/env perl
use 5.016;
use autodie;
use warnings;
use English '-no_match_vars';
use IPC::Open3;
use Symbol 'gensym';
use Readonly;
our $VERSION = 'v.0.0.2';
say system_ipc_open3('/bin/ls')->{'output'};
sub system_ipc_open3 {
my @command = map { split m{\s+}xms } @ARG;
Readonly my $SYSCALL_EXIT_STATUS_MASK => 8;
Readonly my $BUFFER_SIZE => 2_000_000;
my (
$child_in_fh, $child_out_fh, $child_err_fh,
$child_in, $child_out, $child_err,
$buffer, $child_pid, $child_exit_status
) = q[];
$child_err_fh = gensym;
$child_pid = open3( $child_in_fh, $child_out_fh, $child_err_fh,
@command );
$child_exit_status = $CHILD_ERROR >> $SYSCALL_EXIT_STATUS_MASK;
while ( my $read = sysread $child_out_fh, $buffer,
$BUFFER_SIZE ) {
$child_out .= $buffer;
}
while ( my $read = sysread $child_err_fh, $buffer,
$BUFFER_SIZE ) {
$child_err .= $buffer;
}
waitpid $child_pid, 0;
return {
exit_status => $child_exit_status,
error => $child_err || q[],
output => $child_out || q[],
};
}
exit 0;
__END__