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

I'm often doing this:
$cmd = "a_cmd -with a -lot of -arguments that" . "-spill over_eighty characters"; `$cmd`;

"a_cmd" chokes on newlines, so this doesn't work:
`a_cmd -with a -lot of -arguments that -spill over_eighty characters`;

I want to skip building the "$cmd" string first. Is there a "/x" option for qx// like m// has? By that I mean qx/a_cmd .../x would ignore any newlines:
# newline between "that" and "-spill" is stripped out # before "a_cmd" is run. The command string can be # split up to fit the screen. qx/a_cmd -with a -lot of -arguments that -spill over_eighty characters/x;

Replies are listed 'Best First'.
Re: Building multiline qx// shell commands
by Trizor (Pilgrim) on Jul 15, 2007 at 02:15 UTC

    Perl doesn't have something like that, but most shells allow you to escape a newline with a \ like this:

    qx/a_cmd -with a -lot of -arguments that \ -spill over_eighty characters/;
      Yeah, I'm a moron. That works fine.
      print `ls \\ /etc/fstab`;
Re: Building multiline qx// shell commands
by naikonta (Curate) on Jul 15, 2007 at 02:34 UTC
    I prefer to first construct all the options in an array or a hash so I can populate later or change a certain switches based on user input.
    my $cmd = 'a_cmd'; my %options = ( -d => '/home/users', -s => '/bin/sh', -g => 100, ); $options{-c} = $realname if $realname; $options{-d} = $base_homedir if $base_homedir; my $cmd_str = join ' ', $cmd, map { "$_ $options{$_}" } keys %options; my $output = qx/$cmd_str/;
    Using an array can be more straightforward:
    my $cmd = 'a_cmd'; my @options = ( -d => '/home/users', -s => '/bin/sh', -g => 100, ); my $output = qx/$cmd @options/;
    Beside give you a cleaner visual layout, it also makes you easy to manually add options to the array. And specially with array, you don't need to be worried to add extra elements to avoid odd hash element warning.
    my @options = ( -d => '/home/users', # you can add -s => '/bin/sh', # add inline -g => 100, # comments as well '-m', # boolean switch ); # instead of my %options = ( -d => '/home/users', # isn't it nice to be able -s => '/bin/sh', # to put comments for esoteric -g => 100, # external program swithces? -m => '', # boolean switch );
    Well, it's up to you which path to take. I personally don't see any significant difference. I use them both, depending on some specific needs.

    Open source softwares? Share and enjoy. Make profit from them if you can. Yet, share and enjoy!

Re: Building multiline qx// shell commands
by merlyn (Sage) on Jul 15, 2007 at 20:18 UTC
Re: Building multiline qx// shell commands
by dewey (Pilgrim) on Jul 15, 2007 at 02:11 UTC
    Hmm... I can't seem to find one in Quotes and Quote-like Operators...
    I know it's not quite what you were looking for, but you could make a function that strips out newlines and executes.
    Alternatively, you could make a module with some custom RE syntax if you want it to look like a quote-like operator.

    After reading later posts: Trizor++, I won't suggest any more over-the-top hacks :)

    ~dewey
Re: Building multiline qx// shell commands
by ikegami (Patriarch) on Jul 15, 2007 at 08:00 UTC
    You could always remove the line breaks:
    my $cmd = ' ... ... '; $cmd =~ s/\n/ /g; my $output = `$cmd`;