Shellish(3) User Contributed Perl Documentation Shellish(3)

Regexp::Shellish - Shell-like regular expressions

use Regexp::Shellish qw( :all ) ;
$re = compile_shellish( 'a/c*d' ) ;
## This next one's like 'a*d' except that it'll
## match 'a/d'.
$re = compile_shellish( 'a**d' ) ;
## And here '**' won't match 'a/d', but behaves
## like 'a*d', except for the possibility of high
## cpu time consumption.
$re = compile_shellish( 'a**d', { star_star => 0 } ) ;
## The next two result in identical $re1 and $re2.
## The second is a noop so that Regexp references can
## be easily accomodated.
$re1 = compile_shellish( 'a{b,c}d' ) ;
$re2 = compile_shellish( qr/\A(?:a(?:b|c)d)\Z/ ) ;
@matches = shellish_glob( $re, @possibilities ) ;

Provides shell-like regular expressions. The wildcards provided are "?", "*" and "**", where "**" is like "*" but matches "/". See "compile_shellish" for details.

Case sensitivity and constructs like <**>, "(a*b)", and "{a,b,c}" can be disabled.

Compiles a string containing a 'shellish' regular expression, returning a Regexp reference. Regexp references passed in are passed through unmolested.

Here are the transformation rules from shellish expression terms to perl regular expression terms:

Shellish  Perl RE
========  =======
*         [^/]*
?         .
**        .*               ## unless { star_star   => 0 }
...       .*               ## unless { dot_dot_dot => 0 }
(         (                ## unless { parens => 0 }
)         )                ## unless { parens => 0 }
{a,b,c}   (?:a|b|c)        ## unless { braces => 0 }
\a        a                ## These are de-escaped and
\*        \*               ## passed to quotemeta()

The wildcards treat newlines as normal characters.

Parens group in to $1..$n, since they are passed through unmolested (unless option parens => 0 is passed). This is useless when using glob_shellish(), though.

The final parameter can be a hash reference containing options:

compile_shellish(
   '**',
   {
      anchors        => 0,   ## Doesn't put ^ and $ around the
                             ## resulting regexp
      case_sensitive => 0,   ## Make case insensitive
      dot_dot_dot    => 0,   ## '...' is now just three '.' chars
      star_star      => 0,   ## '**' is now two '*' wildcards
      parens         => 0,   ## '(', ')' are now regular chars
      braces         => 0,   ## '{', '}' are now regular chars
   }
) ;

No option affects Regexps passed through.

Pass a regular expression and a list of possible values, get back a list of matching values.
my @matches = shellish_glob( '*/*', @possibilities ) ;
my @matches = shellish_glob( '*/*', @possibilities, \%options ) ;

Barrie Slaymaker <barries@slaysys.com>

2023-07-26 perl v5.38.0