#: facilities used by script/sh and also shared by the testers package Test::Util::Base; use Spiffy -Base; use Text::Balanced qw( gen_delimited_pat ); our @EXPORT = qw( split_arg process_escape ); our $DelimPat; BEGIN { $DelimPat = gen_delimited_pat(q{"}); } sub extract_many (@) { my $text = shift; my @flds; while (1) { #warn '@flds = ', Dumper(@flds); if ($text =~ /\G\s* ( ; | >>? | < | \|\| | \&\& ) /gcox) { push @flds, $1; } elsif ($text =~ /\G\s* ( (?:\\.)+ [^'";><\|\&\s]* )/gcox) { push @flds, $1; } elsif ($text =~ /\G\s*('[^']*')/gco) { push @flds, $1; } elsif ($text =~ /\G\s*($DelimPat)/gco) { push @flds, $1; } elsif ($text =~ /\G\s*( \S (?:[^ ; > < ' " \s \\ \| \& ]|\\.)* )/gcox) { push @flds, $1; } else { last; } } return @flds; } sub split_arg ($) { my $text = shift; return () if not defined $text; return extract_many($text); } sub process_escape (@) { return if $_[0] !~ /\\/; my $list = quotemeta $_[1]; $_[0] =~ s/\\[$list]/substr($&,1,1)/eg; } 1;