Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I am looking for a filter similar to UNIX grep. It should scan a stream of data for some regex and set the exit code accordingly, but it should still pass through the data stream unmodified. We might call it transparent grep, 'tgrep' for short.

Example: The shell command ls | tgrep 'regex' && echo 'found some matching file names' should print all my file names, and append the message in the end.

Would a perl one-liner do? I thought of something similar to this: perl -pe '$match||=/regex/; END {$?=!$match}'

Of course, we might nicely wrap this up in a script file passing arguments etc. Any ideas and comments to make this run, are welcome.

Replies are listed 'Best First'.
Re: 'Transparent grep'
by planetscape (Chancellor) on Feb 26, 2009 at 23:21 UTC
Re: 'Transparent grep'
by ikegami (Patriarch) on Feb 26, 2009 at 23:08 UTC

    grep and the likes already do that.

    • $? = ...; doesn't set the exit code. You need exit !$match.
    • -p prints every line. You'll need -n
    • || will short circuit and only print the first match. (Update)

    Update:

    perl -ne'$m|=/regex/?print&&1:0}exit!$m;{' 1234567890123456789012345678901234567 1 2 3
      $? = ...; doesn't set the exit code.

      Works for me:

      perl -e 'END{$?=1}' && echo foo # prints nothing perl -e 'END{$?=0}' && echo foo # prints "foo"

      You can manipulate $? in an END block.  From perlmod:

      Inside an "END" code block, $? contains the value that the program is going to pass to "exit()". You can modify $? to change the exit value of the program.

        doh, I tested it outside of END.

        And I now see he wants to print every line.

        Just ignore my post!

Re: 'Transparent grep'
by Anonymous Monk on Mar 02, 2009 at 22:38 UTC
    Hello Perl Monks,
    thanks for your answers. I investigated and tested a bit myself. The code seems to work as expected.
    - Everything is printed.
    - Exit code depends on whether the pattern matches or not.
    Remarks:
    1. "exit" function is not recommended within an END block. Do assign $? instead.
    2. One might easily build more complex tools in this way, where UNIX constructs seem to be clumsy, not flexible enough, require multiple pipes or writing temporary files.