in reply to one liner string extraction

Hi, $1 is reset on each attempted match, so if a failed match occurs after your last match, $1 will be unset.

perl -ne '$string=$_ if /Successfully sent/; $match = $1 if $string = +~ /^(.*) INFO.*$/; END{print $match}' $logfile

Hope this helps!


The way forward always starts with a minimal test.

Replies are listed 'Best First'.
Re^2: one liner string extraction
by vr (Curate) on Nov 02, 2017 at 15:33 UTC

    Hm-m, while the above solution works, but by way of nitpicking and because of TIMTOWTDI:

    $1 is reset on each attempted match

    $1 is reset on each successful match, and restored on each scope end. Scope end happens twice (rather, n + 1) in OP: 1st on every loop iteration (-n), second at program finishing but before executing END block(s).

    >perl -wE "'a'=~/(a)/; 'a'=~/b/; say $1" a >perl -wE "'a'=~/(a)/; 'a'=~/a/; say $1" Use of uninitialized value $1 in say at -e line 1. >perl -wE "'a'=~/(a)/; END { say $1 }" Use of uninitialized value $1 in say at -e line 1.

    But we can abuse the fact that, unlike other global variables related to regular expressions, the $^R is not dynamically scoped. Further, let's match only once, and also have a little fun and save us a few keystrokes by using a secret (END will also do, of course):

    >perl -ne "/^(.*) INFO.+Successfully sent(?{$1})/ }{ print $^R" file
Re^2: one liner string extraction
by natxo (Scribe) on Nov 02, 2017 at 12:00 UTC
    of course! Thanks, works like a charm.