Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

using a set variable in system or exec

by Anonymous Monk
on Jul 08, 2003 at 14:13 UTC ( #272287=perlquestion: print w/replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hello !
Can anyone tell me how to use a variable with the exec or system commands?
I want to delete some files before I begin looking at some newer files. I have set $date to aid in removing these older pesky space hog files. I wanted to use it something like this ..
system "rm /storage/filename$date_more_filename.csv"

obviously it does not work ... $date is not passed to the shell correctly. I did look in perldoc but either did not see it or did not comprhend what i saw ...ohh wise ones please assist!

Replies are listed 'Best First'.
Re: using a set variable in system or exec
by broquaint (Abbot) on Jul 08, 2003 at 14:22 UTC
    Before I answer your question I shall point you towards unlink which is a perl function for removing files. As for using variables in system the issue is that the variable in question is being interpolated as $date_more_filename (so nothing to do with the function). So what you need to do is delimit the variable name which you can do by surrounding it in curly braces e.g
    my $date = "Tuesday the 8th of 2003"; ## note the {} around the variable name print "Today is ${date}\n"; __output__ Today is Tuesday the 8th of 2003
    See. perlop for more info on quoting in perl.


Re: using a set variable in system or exec
by dreadpiratepeter (Priest) on Jul 08, 2003 at 14:19 UTC
    The problem is that Perl is trying to substitute $date_more_filename, not $date.
    you want ${date}_more_filename.
    use strict would have caught this.

    "Worry is like a rocking chair. It gives you something to do, but it doesn't get you anywhere."
Re: using a set variable in system or exec
by thinker (Parson) on Jul 08, 2003 at 14:22 UTC

    Or, you could try
    system "rm /storage/filename${date}_more_filename.csv";

    hope this helps

Re: using a set variable in system or exec
by ColtsFoot (Chaplain) on Jul 08, 2003 at 14:18 UTC
    You could try building up the command string as follows
    my $cmd = join('', 'rm /storage/filename', $date, '_more_filename.csv' +); system ($cmd);
Re: using a set variable in system or exec
by blue_cowdawg (Monsignor) on Jul 08, 2003 at 22:26 UTC

    Environmental Variables from Perl

    Maybe I'm missing something here, but look at the following code sniglet:

      --$  cat
      system 'echo ${verb}_me';

    When I run this I get:

      --$ perl

    Maybe this will solve the problem?


    Peter L. BergholdBrewer of Belgian Ales
    Unix Professional
Re: using a set variable in system or exec
by Mago (Parson) on Jul 08, 2003 at 21:51 UTC

    system LIST
    system PROGRAM LIST

    Does exactly the same thing as exec LIST, except that a fork is done first, and the parent process waits for the child process to complete. Note that argument processing varies depending on the number of arguments. If there is more than one argument in LIST, or if LIST is an array with more than one value, starts the program given by the first element of the list with arguments given by the rest of the list. If there is only one scalar argument, the argument is checked for shell metacharacters, and if there are any, the entire argument is passed to the system's command shell for parsing (this is /bin/sh -c on Unix platforms, but varies on other platforms). If there are no shell metacharacters in the argument, it is split into words and passed directly to execvp, which is more efficient.
    Beginning with v5.6.0, Perl will attempt to flush all files opened for output before any operation that may do a fork, but this may not be supported on some platforms. To be safe, you may need to set $| ($AUTOFLUSH in English) or call the autoflush() method of IO::Handle on any open handles.
    The return value is the exit status of the program as returned by the wait call. To get the actual exit value shift right by eight (see below). See also /exec. This is not what you want to use to capture the output from a command, for that you should use merely backticks or qx//, as described in perlop/"`STRING`". Return value of -1 indicates a failure to start the program (inspect $! for the reason).
    Like exec, system allows you to lie to a program about its name if you use the system PROGRAM LIST syntax.
    Because system and backticks block SIGINT and SIGQUIT, killing the program they're running doesn't actually interrupt your program.

    @args = ("command", "arg1", "arg2"); system(@args) == 0 or die "system @args failed: $?"

    You can check all the failure possibilities by inspecting $? like this:
    $exit_value = $? >> 8;<br> $signal_num = $? & 127;<br> $dumped_core = $? & 128; <br>

    or more portably by using the W*() calls of the POSIX extension.
    When the arguments get executed via the system shell, results and return codes will be subject to its quirks and capabilities.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://272287]
Approved by Thelonius
and a kettle whistles...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (1)
As of 2018-01-20 01:35 GMT
Find Nodes?
    Voting Booth?
    How did you see in the new year?

    Results (226 votes). Check out past polls.