Download presentation
Presentation is loading. Please wait.
1
Perl Process Management Learning Objectives: 1. To learn the different Perl’s commands for invoking system process 2. To learn how to perform process management in a Perl program
2
COMP111 Lecture 23a / Slide 2 Table of Content Running Shell Commands - system Backquotes Using Processes as Filehandles Perl Process Management
3
COMP111 Lecture 23a / Slide 3 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"; } Running shell command - system (1)
4
COMP111 Lecture 23a / Slide 4 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 $ Running shell command - system (2)
5
COMP111 Lecture 23a / Slide 5 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 $ Running shell command - system (3)
6
COMP111 Lecture 23a / Slide 6 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) $ Running shell command - system (4)
7
COMP111 Lecture 23a / Slide 7 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. Running shell command - system (5)
8
COMP111 Lecture 23a / Slide 8 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"); Running shell command - system (6)
9
COMP111 Lecture 23a / Slide 9 Backquotes (1) 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).
10
COMP111 Lecture 23a / Slide 10 Backquotes (2) Another example: $ cat back1 #!/usr/local/bin/perl5 -w $where = `pwd`; print "The current directory is: $where"; $ back1 The current directory is /homes/horner $
11
COMP111 Lecture 23a / Slide 11 Backquotes (3) 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) $
12
COMP111 Lecture 23a / Slide 12 If we use a pipe instead of backquote, the Perl program reads input from the previous pipe stage and is therefore more memory efficient and need not wait for the previous program to finish. $ cat whopipe #!/usr/local/bin/perl5 -w open(INFILE, "who|") || die("Cannot run who…\n"); while ( ) { ($who, $where, $when) =/(\S+)\s+(\S+)\s+(.*)/; print "$who on $where at $when\n"; } Using Processes as Filehandles (input)
13
COMP111 Lecture 23a / Slide 13 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 = ;# 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 (1)
14
COMP111 Lecture 23a / Slide 14 This example prints the letter: $ cat print1 #!/usr/local/bin/perl5 -w open(FILE, "letter1");# open the file @letter = ;# read the contents into @letter close(FILE); @nameList = qw(Andrew Bill Bob); foreach $name (@nameList){ open(PRINT, "|lpr -Pcll3"); # 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 Using Processes as Filehandles (2)
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.