Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7943279
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 4, 20262026-06-04T00:13:32+00:00 2026-06-04T00:13:32+00:00

I would like to run a external command in perl and filter some of

  • 0

I would like to run a external command in perl and filter some of the lines.
I don’t know how to filter the lines that go to stderr. I have the following code right now:

#!/usr/bin/env perl

use File::Spec;
#open STDERR, '>', File::Spec->devnull() or die "could not open STDERR: $!\n";

open(FILEHANDLE, '-|', 'Mycmd') or die "Cannot fork: $!\n";
open(STDERR, ">&FILEHANDLE");

while(defined(my $line = <FILEHANDLE>)) {
  chomp($line);
  if( $line =~ m/text1/ or
    $line =~ m/text2/ or
    $line =~ m/text3/
  ) {
    # do nothing
  }
  else {
    print "$line\n";
  }
}
close FILEHANDLE or die "child error: $!\n";

the line

open(STDERR, ">&FILEHANDLE");

is where I try to redirect the stderr to be able to process it with stdout but it doesn’t work.

The solution would have to work in windows.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-04T00:13:34+00:00Added an answer on June 4, 2026 at 12:13 am

    A shell redirect in the argument to open can help here:

    open(FILEHANDLE, 'Mycmd 2>&1 |') or die "Cannot fork: $!\n";
    

    Now FILEHANDLE will see each line of both the standard output and the standard error from Mycmd.

    To use multi-argument open and redirect output, you have to be more deliberate. Say Mycmd is

    #! /usr/bin/env perl
    print "standard output\n";
    warn  "standard error\n";
    

    Opening "-|" gives us the standard output only, so if we run

    #! /usr/bin/env perl
    
    use strict;
    use warnings;
    
    use 5.10.0;
    
    my $pid = open my $fh, "-|", "Mycmd" // die "$0: fork: $!";
    
    while (defined(my $line = <$fh>)) {
      chomp $line;
      print "got [$line]\n";
    }
    

    The output is

    standard error
    got [standard output]

    Notice that the standard output from Mycmd passed through the driver program but not its standard error. To get both, you have to mimic the shell’s redirection.

    #! /usr/bin/env perl
    
    use strict;
    use warnings;
    
    use 5.10.0;
    
    my $pid = open my $fh, "-|" // die "$0: fork: $!";
    
    if ($pid == 0) {
      open STDERR, ">&STDOUT" or die "$0: dup: $!";
      exec "Mycmd"            or die "$0: exec: $!";
    }
    
    while (defined(my $line = <$fh>)) {
      chomp $line;
      print "got [$line]\n";
    }
    

    Now the output is

    got [standard error]
    got [standard output]
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I currently have a Perl script that runs an external command on the system,
I would like to run a external python script (or external command/program) when I
I would like to run the following SQL select: SELECT ID, NUMERATOR, (SELECT m.COLUMNNAME
I would like to run a (extensive) query that produces one line of XML.
I would like to run some code onload of a form in WPF. Is
I would like to run a cmd.exe that would evaluate environment variables at call
I have 1 unit test method that needs several parameters. I would like to
I have an ant task that executes some command on a list of files.
I have a database of questions from an external SQlite manager. I would like
I need to run external tool from within my Perl code. This command works

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.