Post on 30-Dec-2015
description
Perl Process Management
Software Tools
Slide 2
system
Perl programs can execute shell commands (Bourne shell) using the system function.
system("date");
When the command is finished, the system function returns 0 (not 1!) if the command completed successfully.
if(system("date") != 0){
print "Wah! Date failed!\n";
}
Slide 3
system
Where does the command output go? Answer: The display screen, unless it is
redirected.
$ cat system1
#!/usr/local/bin/perl5 -w
system("date");
$ system1
Thu Apr 15 14:30:03 HKT 1999
$
Slide 4
system
How to redirect the I/O? Answer: Same as the shell
$ cat system2
#!/usr/local/bin/perl5 -w
if(system("date >now")){
die "cannot create file now";
}
$ system2
$ cat now
Thu Apr 15 14:30:03 HKT 1999
$
Slide 5
system system allows multiple commands, separated by
semicolons or newlines. Processes that end in & are run as background jobs (Perl
continues and does not wait for the job to finish).$ cat system3#!/usr/local/bin/perl5 -w$where = "now"; # Perl variable, not shell variable
system "(date; who) >$where &";$ system3$ cat nowThu Apr 15 14:58:56 HKT 1999horner pts/0 Apr 15 14:28 (csz096.cs.ust.hk)$
Slide 6
system
In the previous example, $where is replaced with its value (by Perl, not the shell).
If you want to reference a shell variable named $where, you need to put a backslash in front of the dollar sign.
The invoked shell command will inherit the current working directory from the Perl program.
Slide 7
system
How would you look for the string “Bill Gates” in the file bill?
$ grep "Bill Gates" bill
Answer: system allows the first argument to be the command, and the remaining arguments to be the arguments to the command.
system("grep", "Bill Gates", "bill");
Slide 8
Backquotes
How do you assign the output of a command to a variable?
Answer: Use backquotes.
$now = `date`;
The value of $now will contain the result of the date commend (including the trailing newline).
Slide 9
Backquotes
Another example:
$ cat back1
#!/usr/local/bin/perl5 -w
$where = `pwd`;
print "The current directory is: $where";
$ back1
The current directory is /homes/horner
$
Slide 10
Backquotes
If the backquoted command is used in a list context, you get a list of strings, each one being a line (terminated in a newline).
$ whohorner pts/0 Apr 15 14:28 (csz096.cs.ust.hk)
$ cat back2#!/usr/local/bin/perl5 -wforeach $_ (`who`){
($who, $where, $when) = /(\S+)\s+(\S+)\s+(.*)/;print "$who on $where at $when\n";
}$ back2horner on pts/0 at Apr 15 14:28 (csz096.cs.ust.hk)$
Slide 11
Using Processes as Filehandles Another way to run a shell command looks similar to filehandles,
using open, close, and print. The following example allows you to customize a letter and
automatically email it to different recipients:$ cat mail1#!/usr/local/bin/perl5 -wopen(FILE, "letter1"); # open the file@letter = <FILE>; # read the contents into @letterclose(FILE);@emailList = qw(horner@cs.ust.hk horner@ust.hk);foreach $email (@emailList){open(MAIL, "|mail -s \"hi!\" $email"); #open messageprint MAIL "Hi $email,\n"; # add header to messageprint MAIL @letter; # add content to messageclose MAIL; # send message!}$ mail1
Slide 12
Using Processes as Filehandles This example prints the letter:
$ cat print1#!/usr/local/bin/perl5 -wopen(FILE, "letter1"); # open the file@letter = <FILE>; # read the contents into @letterclose(FILE);@nameList = qw(Andrew Bill Bob);foreach $name (@nameList){
open(PRINT, "|lpr –Pcll2a"); # open print jobprint PRINT "Hi $name,\n"; # add header to jobprint PRINT @letter; # add content to jobclose PRINT; # send print job!
}$ print1