sub expand_path ($$$\$) { # inputs: (product,version,is_32bit(T/F), ptr(expanded_path)) # output: (-,-,-, expanded_path) # returns T/F (successful path expansion) my ($p, $v, $is32bitbit, $expp) = @_; my $is32_text = $is32bitbit ? "32bit-" : ""; my $rpm = ($v !~ /\.rpm$/) ? "$p-$is32_text$v-*.rpm" : "$p-$is32_text$v*"; my $exp; if (defined ($exp = `2>&1 bash -c "echo $rpm"`)) { chomp $exp; if ($exp !~ /\*/) { $$expp=$exp; return 1; } } $$expp = $rpm; return 0; } #### If the *extglob* shell option is enabled using the *shopt* builtin, several extended pattern matching operators are recognized. In the following description, a pattern-list is a list of one or more patterns separated by a |. Composite patterns may be formed using one or more of the fol- lowing sub-patterns: ?(pattern-list) Matches zero or one occurrence of the given patterns *(pattern-list) Matches zero or more occurrences of the given patterns +(pattern-list) Matches one or more occurrences of the given patterns @(pattern-list) Matches one of the given patterns !(pattern-list) Matches anything except one of the given patterns #### echo gcc-+([^-])-+([^-]).rpm #### gcc-32bit-4.2-24.x86_64.rpm gcc-4.2-24.x86_64.rpm gcc-ada-4.2-24.x86_64.rpm gcc-c++-4.2-24.x86_64.rpm gcc-fortran-32bit-4.2-24.x86_64.rpm gcc-fortran-4.2-24.x86_64.rpm gcc-gij-32bit-4.2-24.x86_64.rpm gcc-gij-4.2-24.x86_64.rpm gcc-info-4.2-24.x86_64.rpm gcc-java-4.2-24.x86_64.rpm gcc-locale-4.2-24.x86_64.rpm gcc-obj-c++-4.2-24.x86_64.rpm gcc-objc-32bit-4.2-24.x86_64.rpm gcc-objc-4.2-24.x86_64.rpm gcc41-32bit-4.1.3_20070724-15.x86_64.rpm gcc41-4.1.3_20070724-15.x86_64.rpm gcc41-ada-4.1.3_20070724-15.x86_64.rpm gcc41-c++-4.1.3_20070724-15.x86_64.rpm gcc41-fortran-32bit-4.1.3_20070724-15.x86_64.rpm gcc41-fortran-4.1.3_20070724-15.x86_64.rpm gcc41-gij-32bit-4.1.3_20070724-25.x86_64.rpm gcc41-gij-4.1.3_20070724-25.x86_64.rpm gcc41-java-4.1.3_20070724-15.x86_64.rpm gcc41-locale-4.1.3_20070724-15.x86_64.rpm gcc41-obj-c++-4.1.3_20070724-15.x86_64.rpm gcc41-objc-32bit-4.1.3_20070724-15.x86_64.rpm gcc41-objc-4.1.3_20070724-15.x86_64.rpm gcc41-testresults-4.1.3_20070724-25.x86_64.rpm gcc42-32bit-4.2.1_20070724-17.x86_64.rpm gcc42-4.2.1_20070724-17.x86_64.rpm gcc42-ada-4.2.1_20070724-17.x86_64.rpm gcc42-c++-4.2.1_20070724-17.x86_64.rpm gcc42-fortran-32bit-4.2.1_20070724-17.x86_64.rpm gcc42-fortran-4.2.1_20070724-17.x86_64.rpm gcc42-gij-32bit-4.2.1_20070724-26.x86_64.rpm gcc42-gij-4.2.1_20070724-26.x86_64.rpm gcc42-info-4.2.1_20070724-17.x86_64.rpm gcc42-java-4.2.1_20070724-17.x86_64.rpm gcc42-locale-4.2.1_20070724-17.x86_64.rpm gcc42-obj-c++-4.2.1_20070724-17.x86_64.rpm gcc42-objc-32bit-4.2.1_20070724-17.x86_64.rpm gcc42-objc-4.2.1_20070724-17.x86_64.rpm gcc42-testresults-4.2.1_20070724-26.x86_64.rpm #### gcc-32bit-4.2-24.x86_64.rpm gcc-4.2-24.x86_64.rpm gcc-ada-4.2-24.x86_64.rpm gcc-c++-4.2-24.x86_64.rpm gcc-fortran-32bit-4.2-24.x86_64.rpm gcc-fortran-4.2-24.x86_64.rpm gcc-gij-32bit-4.2-24.x86_64.rpm gcc-gij-4.2-24.x86_64.rpm gcc-info-4.2-24.x86_64.rpm gcc-java-4.2-24.x86_64.rpm gcc-locale-4.2-24.x86_64.rpm gcc-obj-c++-4.2-24.x86_64.rpm gcc-objc-32bit-4.2-24.x86_64.rpm gcc-objc-4.2-24.x86_64.rpm #### #!/usr/bin/perl $pat='+([^-])-+([^-]).rpm'; $a=`bash -c "shopt -s extglob ;echo gcc-$pat"`; print "a=$a\n"; #### bash: -c: line 0: syntax error near unexpected token `(' bash: -c: line 0: `shopt -s extglob ;echo gcc-+([^-])-+([^-]).rpm' a= #### (double backslash in front of parens:) #!/usr/bin/perl $pat='+\\([^-]\\)-+\\([^-]\\).rpm'; $a=`bash -c 'shopt -s extglob ;echo gcc-$pat'`; print "a=$a\n"; #### a=gcc-+([^-])-+([^-]).rpm