#!/usr/bin/env perl # Execute shell commands with the included block passed to their stdin. # # I haven't wound up using this much, but in principle it has some # applications. # # See also: filter-exec, filter-exec-raw. use strict; use warnings; use 5.10.0; use IPC::Cmd qw(can_run run_forked); my $text; { # line separator: local $/ = undef; $text = <>; } $text =~ s{ \n (.*?)\n }{ handle_block($1, $2); }egsx; print $text; sub handle_block { my ($command, $input) = @_; my $output_text = ''; my $result = run_forked($command, { child_stdin => $input, timeout => 300, stdout_handler => sub { $output_text .= $_[0]; }, stderr_handler => sub { $output_text .= $_[0]; } }); # Kill any trailing newlines so that the output will fit between markers # without adding a blank line (something about this will probably lead to # bugs eventually): chomp($output_text); my $starter = 'exec-stdin'; return "\n$output_text\n"; } __DATA__ A self-test - add some numbers and use ,r in vim to check: 1 2 8 9 10