120 likes | 196 Views
Software Tools. Perl Process Management. 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){
E N D
Software Tools Perl Process Management
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"; }
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 $
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 $
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 now Thu Apr 15 14:58:56 HKT 1999 horner pts/0 Apr 15 14:28 (csz096.cs.ust.hk) $
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.
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");
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).
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 $
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). $ who horner pts/0 Apr 15 14:28 (csz096.cs.ust.hk) $ cat back2 #!/usr/local/bin/perl5 -w foreach $_ (`who`){ ($who, $where, $when) = /(\S+)\s+(\S+)\s+(.*)/; print "$who on $where at $when\n"; } $ back2 horner on pts/0 at Apr 15 14:28 (csz096.cs.ust.hk) $
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 -w open(FILE, "letter1"); # open the file @letter = <FILE>; # read the contents into @letter close(FILE); @emailList = qw(horner@cs.ust.hk horner@ust.hk); foreach $email (@emailList){ open(MAIL, "|mail -s \"hi!\" $email"); #open message print MAIL "Hi $email,\n"; # add header to message print MAIL @letter; # add content to message close MAIL; # send message! } $ mail1
Using Processes as Filehandles • This example prints the letter: $ cat print1 #!/usr/local/bin/perl5 -w open(FILE, "letter1"); # open the file @letter = <FILE>; # read the contents into @letter close(FILE); @nameList = qw(Andrew Bill Bob); foreach $name (@nameList){ open(PRINT, "|lpr –Pcll2a"); # open print job print PRINT "Hi $name,\n"; # add header to job print PRINT @letter; # add content to job close PRINT; # send print job! } $ print1