in reply to regex extracting text

Often instead of using the non-greedy ? to modify .*, use a negated character class:

sub name { my ($str) = @_; return $str =~ m/\@([^.]+)/ ? $1 : ''; }

which makes the nature of the match clearer ("I want everything except '.'") and generally leads to fewer surprise matches.

Note too that you should always use strictures (use strict; use warnings;) and (almost) never use prototypes. Assigning parameters to explicitly named variables helps make their use clearer, the nature of the parameters and use of the sub clearer, and avoids accidentally altering the variables passed into the sub (the elements in @_ are aliases to the parameters passed in).

True laziness is hard work

Replies are listed 'Best First'.
Re^2: regex extracting text
by JavaFan (Canon) on Apr 29, 2012 at 10:34 UTC
    You subtly changed the OPs (.*) into a ([^.]+)? Did you do that on purpose? I believe so, otherwise, the line:
    return $str =~ m/\@([^.]+)/ ? $1 : '';
    doesn't make sense. The OP original patters allows for the capture of an empty string; and an undefined value will be returned if there was no match. If your pattern is changed to allow empty string matches, you can no longer distinguish between "not a match", and "empty match". You also leave off the matching of a dot, meaning you match on foo@bar, where the OP doesn't. Finally, there's no need to escape the @.

    sub name { return $1 if $_[0] =~ /@([^.*])\./; }
      thanks for that guys.. still learning regex :)