http://www.perlmonks.org?node_id=1052539


in reply to extract the value before a particualr string

Hi nanban,
I am looking for extracting a number between in the below line
How would you that using Perl?
The best way to get help is to try something first, show such and help will then bring understanding.
I would advise that you check How do I post a question effectively?.
Seeing that you are new here, I could give you a head up that solves the this dataset you posted like so:

use warnings; use strict; while(<DATA>){ chomp; print $1,$/ if/\s+?(\d+?)\/total$/; } __DATA__ Apples Orances:5433 55552246:777449 Country 457852/total Apples Red:9987 green:777449 Public 74585/total
produces ..
457852 74585
But of what help is that, if your dataset changes or you have a different input files?
Hope this helps.

If you tell me, I'll forget.
If you show me, I'll remember.
if you involve me, I'll understand.
--- Author unknown to me

Replies are listed 'Best First'.
Re^2: extract the value before a particualr string
by nanban (Initiate) on Sep 05, 2013 at 10:57 UTC
    thanks.

    I did try somethin like using split with multiple parameters but it extacts the whole line.

    can u help mein understand this line

    print $1,$/ if/\s+?(\d+?)\/total$/;

    I understood what we are trying to do here if/\s+?(\d+?)\/total but the thing before and after i dont get it

      $1 holds the result of the pattern match captured inside (parenthesis). If you had multiple parens then there would also be a $2, $3, etc. The $/ variable is the input record separator, this defaults to being a newline, so print $_,$/ is equivalent to print "$_\n". The $ after total tells the regex engine that total will be the last thing on the line.

      Cheers,
      R.

      Pereant, qui ante nos nostra dixerunt!

        So, if we need to do the operation on a variable line and assign the output to a variable how do we go abt it???

        $count = $line if/\s+?(\d+?)\/total$/;

        will this look fine?

      Random_Walk has given a good explanation.
      However, maybe the following line could help clear the that line a bit.
      print $1,$/ if m{\s+?(\d+?)\/total$};
      The above line shows clearly that after "total", what you have is "$" that indicate the end of the string and not "$/". The / that follows "$" is the second "slash" of the match operator i.e

      m// ^ This one
      In addition to all that, using the module "YAPE::Regex::Explain" the regular expression matches could be explain as thus:
      The regular expression: (?-imsx:\s+?(\d+?)/total$) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?-imsx: group, but do not capture (case-sensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- \s+? whitespace (\n, \r, \t, \f, and " ") (1 or more times (matching the least amount possible)) ---------------------------------------------------------------------- ( group and capture to \1: ---------------------------------------------------------------------- \d+? digits (0-9) (1 or more times (matching the least amount possible)) ---------------------------------------------------------------------- ) end of \1 ---------------------------------------------------------------------- /total '/total' ---------------------------------------------------------------------- $ before an optional \n, and the end of the string ---------------------------------------------------------------------- ) end of grouping ----------------------------------------------------------------------

      If you tell me, I'll forget.
      If you show me, I'll remember.
      if you involve me, I'll understand.
      --- Author unknown to me
      I did try somethin like using split with multiple parameters but it extacts the whole line.

      I'm intrigued. Could you post the code that extacted the whole line?