logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Perl::Critic::Policy::InputOutput::ProhibitBacktickOperators - Discourage stuff like "@files = `ls

Affiliation

       This Policy is part of the core Perl::Critic distribution.

Author

       Jeffrey Ryan Thalhammer <jeff@imaginative-software.com>

Configuration

       Alternatively, if you do want to use backticks, you can restrict checks to void contexts by adding the
       following to your .perlcriticrc file:

           [InputOutput::ProhibitBacktickOperators]
           only_in_void_context = 1

       The purpose of backticks is to capture the output of an external command.  Use of them in a void context
       is likely a bug.  If the output isn't actually required, system() should be used.  Otherwise assign the
       result to a variable.

           `some_command`;                      #not ok
           $output = `some_command`;            #ok
           @output = `some_command`;            #ok

Description

       Backticks are super-convenient, especially for CGI programs, but I find that they make a lot of noise by
       filling up STDERR with messages when they fail.  I think its better to use IPC::Open3 to trap all the
       output and let the application decide what to do with it.

           use IPC::Open3 'open3';
           $SIG{CHLD} = 'IGNORE';

           @output = `some_command`;                      #not ok

           my ($writer, $reader, $err);
           open3($writer, $reader, $err, 'some_command'); #ok;
           @output = <$reader>;  #Output here
           @errors = <$err>;     #Errors here, instead of the console

Name

       Perl::Critic::Policy::InputOutput::ProhibitBacktickOperators - Discourage stuff like "@files = `ls
       $directory`".

Notes

       This policy also prohibits the generalized form of backticks seen as "qx{}".

       See perlipc for more discussion on using wait() instead of "$SIG{CHLD} = 'IGNORE'".

       You might consider using the capture() function from the IPC::System::Simple module for a safer way of
       doing what backticks do, especially on Windows.  The module also has a safe wrapper around system().

See Also