[Chicago-talk] Probably and easy explanation I'm missing...

Jonathan Rockway jon at jrock.us
Thu Aug 24 13:44:34 PDT 2006

> I realize I'm not as smart as a I once was. I'm confused about the
> following substitution:
>         my $filename   = $GLOBAL{'FILE_NAME'};
>         $filename =~ s/.+\\([^\\]+)$|.+\/([^\/]+)$/$1/;
> How does the $1 work in this? Is it necessary? 

$1 is the contents of the (capture).  You're replacing the entire match
with the value of the first capture.  (There are two first captures in
your case, though :)

Let's use a simpler example:


This will match something like this:


And fill ($1, $2) with ("1234", "5678")

The replacement part then replaces the entire match with "$2$1", yielding:


Something like


will change to


Anyway, your substitution will change something like "foo\bar" to "bar",
or foo\bar\baz to "baz".  The | chooses between Windows paths and UNIX

BTW, File::Spec would be a better way to do this.

Finally, you might enjoy using "use re 'debug';" at the top of your
program.  It will give you helpful output like this:

$ perl -Mre=debug -ne 's/foo/bar/g; print;'
Freeing REx: `","'
Compiling REx `foo'
size 3 Got 28 bytes for offset annotations.
first at 1
   1: EXACT <foo>(3)
   3: END(0)
anchored "foo" at 0 (checking anchored isall) minlen 3
Offsets: [3]
        1[3] 0[0] 4[0]
typed> this is a foo bar
Guessing start of match, REx "foo" against "this is a foo bar
Found anchored substr "foo" at offset 10...
Starting position does not contradict /^/m...
Guessed: match at offset 10
Matching REx "foo" against "foo bar
  Setting an EVAL scope, savestack=8
  10 <is a > <foo bar>    |  1:  EXACT <foo>
  13 <s a foo> < bar
>    |  3:  END
Match successful!
Guessing start of match, REx "foo" against " bar
Did not find anchored substr "foo"...
Match rejected by optimizer
Not present...
Match failed
result> this is a bar bar

Jonathan Rockway

More information about the Chicago-talk mailing list