in reply to getting shell expansion to work

If you want "shell" expansion (csh to be exact), the glob function is what you want, or, if you prefer a module and saner expansion, File::Glob. I couldn't follow your description of things you tried, so I won't comment on why they failed for you. If you provide better code, possibly wrapped in <code>...</code> tags, they will be more readable for me and I can maybe tell you where you went wrong.

You seem to be unclear about where "shell expansion" happens - it does not happen within Perl but within your shell. So, if you want shell expansion Just Like Your Shell Does, you will have to call your shell and ask it to expand the pattern.

In many cases, reading the Perl documentation of the built-in functions (perlfunc) helps lots.

Replies are listed 'Best First'.
Re^2: getting shell expansion to work
by FunkyMonk (Bishop) on Dec 28, 2007 at 00:33 UTC
    Hasn't glob been using File::Glob for some time (somewhere in the 5.6.X releases)?

      Yes.

      Yes, but File::Glob allows you to use "BSD semantics" via bsd_glob, which allow for whitespace in the file specification instead of implying whitespace as the delimiter for multiple specifications.

Re^2: getting shell expansion to work
by perl-diddler (Chaplain) on Dec 27, 2007 at 20:50 UTC
    Sorry, my note got mangled by the perlmonk-text-input text mangler. I didn't know that square brackets were a reserved HTML character that would be deleted...(I managed to put in the paragraph breaks, but then missed the important "tree" (the expression I was focusing on) due to my focus on the forest (all of my text needing formatting to appear the way I wrote it).

    I'm sorry you are unclear about where I'm intending shell expansion to occur. I'm hoping, ney, desiring that text expansion occur in my shell, as determined by the "$SHELL" variable . I see that's a mistake -- that perl uses the more predictable "/bin/sh". Attempting to expand my expression in the shell was why I used backquotes. Unfortunately, I forgot that Perl ignores "$SHELL and uses /bin/sh (otherwise it would run differently on each end-user (if there were other users using this code)'s system).

    I really should (as you mention) redo the note using code tags to quote things. Le'me rewrite using better text for the input example as well, as the case I selected was poor in that it doesn't show all of my "matching" problems.

      I guess the simplest way is then to be explicit about what you want to happen, instead of hoping for some magic in Perl that you don't know about:

      my $pattern = 'mc-lang-+([^-])-+([^-])*.rpm'; my $results = `$ENV{SHELL} -c echo $pattern`;

      assuming that by $SHELL you mean the environment variable $SHELL and not the Perl variable $SHELL.

        Yes...specifically, I wanted bash's expansion, so more recent revisions have included deliberate specification using "bash -c". Someone else noted that they got the extended regular expressions to work using the backquote syntax even though perl invokes bash using the "sh" alias. They (and I) both thought that invoking bash with the sh alias might limit bash to 'sh' compatibility mode...but surprise -- it didn't (not that one should rely on such things! :-)...