ITEC 400 Perl and Man Pages

Preview:

DESCRIPTION

ITEC 400 Perl and Man Pages. George Vaughan Franklin University. Topics. What is Perl? Types Storage Concepts File Interaction Flow Control Pattern Matching Man Pages. What is Perl?. Perl – Practical Extraction and Report Language Created by Larry Wall Evolving Language - PowerPoint PPT Presentation

Citation preview

1

ITEC 400Perl and Man Pages

George Vaughan

Franklin University

2

Topics

• What is Perl?

• Types

• Storage Concepts

• File Interaction

• Flow Control

• Pattern Matching

• Man Pages

3

What is Perl?

• Perl – Practical Extraction and Report Language

• Created by Larry Wall

• Evolving Language

• Current version is Version 5

• Type: perl –v to find the version in your environment

4

Quick Notes on Syntax

• Quotes behave like those in shell scripts:– Double Quotes: treat contents as a single

value (allowing for variable interpolation).– Single Quotes: treat contents literally.– Backwards Quotes: execute contents

• Backslash interpolation: can be used to encode special characters – (carriage return = \n).

5

Types

• Perl does not require you to declare variables or variable type.

• Perl will interpret values such as string, integer, float, character, command, etc. based on context.

• Variables not yet defined have values of either “” or zero.

6

Storage Concepts

• At a simplified level, Perl views variables of being one of two types:

• Singular – variables that hold a single value (scalar). Example: a number or string.

• Plural – variables that represent multiple values (arrays, hashes). Example: an array of numbers or array of strings.

7

Singular (Scalar) Variables

• Singular (scalar) variables are prefixed with a dollar ($) symbol:$myVar = “A String”;

print $myVar, “\n”;

• Notice that the Perl variable name is prefixed with “$” during assignment in addition to reference (unlike shell).

8

A Note On Examples• Source for all examples in this and future lectures are on codd (einstein) at:

/export/home/vaughang/public_html/itec400/examples• and on the web at:

– http://cs.franklin.edu/~vaughang/itec400/examples/• All shell examples are written in Korn Shell (ksh) although they should be

quite compatible with Bash.• In all examples, the ‘greater-than’ symbol, ‘>’ will be used to indicate the

shell prompt. So, if we execute the date command,>dateThu Sep 2 20:43:58 EDT 2004

we only type ‘date’ and not ‘>date’.• All scripts should be able to execute on codd (einstein) which is a Solaris

machine, or any Linux distribution that supports Korn shell, located at /bin/ksh.

9

Example ex03100001 #!/usr/bin/perl -w00020003 ###########0004 # File: ex03100005 #0006 # A simple Perl script that demonstrates0007 # the use of singular (scalar) variables0008 ###########0009 $time = `date`; 0010 $text = "Hello, the time is $time\n";0011 print $text;

• Line 1: note to shell that this is a perl script Use path specified by “which perl”.

• Line 9: capture output of date command in scalar variable $time.

• Line 11: print contents of $text to stdout.

• Notice that that each statement is terminated with a semicolon.

• OUTPUT:>ex00310Hello, the time is Sun Sep 19 12:33:19

EDT 2004

10

How To Execute A Perl Script

• There are several ways:– Type: perl ex0310– Adding “#!/usr/bin/perl -w” to top of script

and setting permissions for execution allows us to simply type: ex0310

– The perl ‘-w’ option will produce warning messages (handy for debugging)…

11

Plural Variables

• 2 Types: arrays and hashes

• Arrays – useful when using numeric position to retrieve information (example: room number).

• hashes – useful when using a key to retrieve information from a list (example: license plate number)

12

Arrays

• An ordered list of numbers, strings, and/or references to arrays or hashes.

• Array variables are prefixed with an ‘at’ symbol (@).• Array length is not declared and arrays can grow

dynamically at run time.• $length_of_myArray = scalar(@myArray);• In the next example, you will see how to:

– assign a list to an array– assign an array to a list– assign a value to an element– use an array as a stack

13

Example ex03200001 #!/usr/bin/perl -w00020003 ###########0004 # File: ex03200005 #0006 # A simple Perl script that demonstrates0007 # the use of array (plural) variables0008 ###########00090010 @days = ("mon", "tue", "wed", "thu");0011 ($day1, $day2, $day3) = @days;0012 print "The third day = $day3\n";0013 $days[4] = "fri";0014 print "The fifth day = $days[4]\n";0015 push @days, "sat";0016 push @days, "sun";0017 print "The sixth day = $days[5]\n";0018 print "The seventh day = ",0019 pop @days, "\n";

• Line 10: assign a list of literals to an array.

• Line 11: assign first 3 elements of array to list of singular variables.

• Line 13: assign a value to an array element (note: element is scalar).

• Array indices start at zero.• Lines 15 and 16: Treat array as

stack and push 2 values on stack.• Line 17: print array element• Liine 18 and 19: pop stack and

print its value.• OUTPUT:The third day = wedThe fifth day = friThe sixth day = satThe seventh day = sun

14

Hashes

• Internally implemented as a hash table.

• Cannot be treated like a stack.

• Collection of “key-value” pairs. – When assigning a list to a hash, the list must

also be a list of “key-value” pairs.

• Hash variables are prefixed with the percent sign (%).

15

Hashes

• Lists can be assigned to hashes using 2 different forms of syntax:%myHash = (key1, val1, key2, val2, ….);

%myHash = (

key1 => val1,

key2 => val2,

);

16

Example ex03300001 #!/usr/bin/perl -w00020003 ###########0004 # File: ex03300005 #0006 # A simple Perl script that demonstrates0007 # the use of hash (plural) variables0008 ###########00090010 %states_1 = ( "oh", "Ohio", "fl", "Florida",0011 "de", "Delaware" );0012 print "I live in $states_1{oh}\n";00130014 %states_2 = (0015 "oh" => "Ohio",0016 "fl" => "Florida",0017 "de" => "Delaware"0018 );0019 print "I was born in $states_2{de}\n";

• Line 10: assign key-value pair list to hash.

• Line 14: assign key-value pair list to hash using an alternative syntax format.

• OUPUT:

I live in Ohio

I was born in Delaware

17

Array and Hash Slices

• It is possible to grab slices (subsets) of arrays and hashes.

• The slice itself is always an array.• Arrays:

@myArray[n..m] #n and m is index range@myArray[n, m, o] #n, m, and o are indices

• Hashes:@myHash{‘n’, ‘m’} #n and m are keys

# The @ indicates that# the result is an array.

18

Example ex03400001 #!/usr/bin/perl -w00020003 ###########0004 # File: ex03400005 # array and hash slices0006 ###########00070008 @days = ("mon", "tue", "wed", "thu",0009 "fri", "sat", "sun");0010 @weekdays = @days[0..4];0011 print "weekdays = @weekdays\n";0012 @tdays = @days[1,3];0013 print "tdays = @tdays\n";0014 %states_1 = ( "ca", "California", "fl",0015 "Florida", "de", "Delaware" );0016 @eastStates = @states_1{'fl', 'de'};0017 print "eastStates = @eastStates\n";

• Line 8: create array “days”• Line 10: grab slice of array “days” (i.e.

elements 0 through 4).• Line 12: grab slice of array “days” (i.e.

elements 1 and 3).• Line 14: create hash “states_1”• Line 16: grab slice of hash (entries for

Florida and Delaware)• OUTPUT:$ex0340weekdays = mon tue wed thu fritdays = tue thueastStates = Florida Delaware

19

File Interaction

• Opening a file for Reading

• Reading from a file

• Opening a file for Writing

• Writing to a file

20

File Handles

• A file handle is nothing more than a program defined name for a file.

• The file handle name does not have to match the file name.

• The file handle is bound to a file or pipe with the open statement.

21

Opening Files and Pipes

• Read from an existing file:– open(MY_FILE, “my_file”), open(MY_FILE, “<my_file”)

• Create a file and write to it:– open(MY_FILE, “>my_file”)

• Append to and existing file:– open(MY_FILE, “>>my_file”)

• Set up an output filter:– open(MY_FILE, “| command”)

• Set up an input filter:– open(MY_FILE, “command |”)

• Special File Handles: STDIN, STDOUT and STDERR

22

Closing a File or Pipe

• close FILE_HANDLE

• A file will be closed automatically if its file handle is used in another open statement.

• All files will be closed upon completion of the script.

23

Reading from a File or Pipe

• The angle brackets are used for reading a line of input.• $myVar = <MY_FILE> will read one line of text from the

file referenced by MY_FILE.• $myVar = <STDIN> will read a line from standard in

(usually the keyboard).• $myVar = <> will read a line from one or more files on

the command line (or STDIN if no files were specified).• Reading a line from a file or STDIN will also read the

new-line character (/n). Use “chomp()” to remove new-line character.

24

Example ex03500001 #!/usr/bin/perl -w00020003 ###########0004 # File: ex03500005 #0006 # A simple Perl script that demonstrates0007 # the use of working with files0008 ###########00090010 open(PASSWD, "/etc/passwd") or die

"Can't open passwd: $!\n";0011 $total = 0;0012 while ($line = <PASSWD>) {0013 @fields = split(":", $line);0014 ($uid, $name) = ($fields[0], $fields[4]);0015 print "$uid, $name\n";0016 ++$total;0017 }0018 print "total = $total\n";

• Line 10: open file• Line 12: For each loop, assign the

next line of input to $line• Line 13: Break up input along the

field separator, ‘:’, and assign each piece to an array element.

• Line 14: multiple assignments• OUPUT (subset):vaughang, George Vaughanswartwod, Don Swartwoutpandarir, Raghavender R. Pandariettefagm, Mohamad Ettefaghfleigd, David Fleigforsheyr, Ralph Forsheytotal = 255

25

String Operators

• Most of the familiar operators are described in the book.

• String Concatenation Operator “.”$a = $b . $c;

$a .= $b;

• String Multiplication Operator “x”$a = “a” x 3; #$a = “aaa”

26

Example ex03550001 #!/usr/bin/perl -w00020003 ###########0004 # File: ex03550005 # Create histogram of processes per user0006 ###########0007 open(PROCESSES, "ps -ef | sed '/UID/d' |")0008 or die "Can't open processes: $!\n";0009 $marker = "*";0010 while ($line = <PROCESSES>) {0011 @fields = split(" ", $line);0012 $uid = $fields[0];0013 $processes{$uid}++;0014 }00150016 foreach $uid (sort keys %processes) {0017 printf ("%8s: %4d ", $uid,

$processes{$uid});0018 print $marker x $processes{$uid}, "\n";0019 }

• Line 7: Open pipe using output of ‘ps’• Lines 10-14: count number of

processes per user• Lines 16-19: For each user on the

system, print name, number of processes and chart.

• Line 17: Notice use of printf function to format output.

• Line 18: string multiplication

• OUTPUT (Subset):vaughang: 4 **** velez04: 1 *wachir01: 1 * wangt: 1 * yang05: 2 ** yeh04: 2 ** yehpo: 2 **

27

Math Operators

• Very similar to C.

• Book provides good overview

28

Comparison Operators

Comparison Numeric String

Equal == eq

Not Equal != ne

Less Than < lt

Greater Than > gt

Less Than or Equal <= le

Greater Than or Equal >= ge

Comparison <==> cmp

29

Conditional File Operators

operator Comments

-e $myFile Does $myFile exist?

-r $myFile Is $myFile readable by me?

-w $myFile Is $myFile writable by me?

-d $myFile Is $myFile a directory?

-f $myFile Is $myFile a regular file?

-T $myFile Is $myFile a text file?

30

Flow Control

• “if” and “if, else”

• “unless”

• “while”

• “for”

• for each”

31

“if” and “if, else”

• “if”if (conditional_expr) {

statement_list

}

• “if, else”if (conditional_expr) {

statement_list

}

else {statement_list

}

• Note: curly braces are mandatory

32

“elsif” and “unless”

• “elsif”if (conditional_expr) {

statement_list

}

elsif (conditional_expr) {statement_list

}

• “unless”unless (conditional_expr) {

statement_list

}

• “elsif” statements can be daisy-chained.

• an “elsif” statement can be followed by an “else” statement.

• “unless” is like saying:if something is false,

then execute block.

33

Example: ex03600001 #!/usr/bin/perl -w00020003 ###########0004 # File: ex03600005 # Demo of if, elsif, unless0006 ###########0007 unless (scalar(@ARGV)==2) {0008 print "usage: ex0360 v1 v2",0009 "\n";0010 exit 1;0011 }0012 if ($ARGV[0] > $ARGV[1]) {0013 print "number $ARGV[0] is greater ";0014 print "than $ARGV[1]\n";0015 }0016 else {0017 print "number $ARGV[0] is less than";0018 print " or equal to $ARGV[1]\n";0019 }0020 exit 0;

• Line 7: execute block if condition is false.

• Line 7: test if there are exactly 2 command line arguments.

• Line 10: exit with return status of 1.• Line 12: Numerical comparison of

command line argument 1 and 2.• Output 1:

>ex0360 3 2number 3 is greater than 2

• Output 2:>ex0360 2usage: ex0360 v1 v2

34

“while” and “do while” Loops

• “while”while (conditional_expr) {

statement_list

}

• “do while”do {

statement_list

} while (conditional_expr) ;

• See ex0350 for example of “while”

• “while” loop will execute zero or more times.

• “do while” loop will execute one or more times.

35

“until” and “do until” Loops

• “until”until (conditional_expr) {

statement_list

}

• “do until”do {

statement_list

} until (conditional_expr) ;

• “until” loops are like “while” loops except we loop as long as the conditional expression is false.

• “until” loop will execute zero or more times.

• “do until” loop will execute one or more times.

36

“for” Loops

for (a; b; c) {

statement_list

}where:• a = initial conditions• b= conditional expression• c = iterative action

• Same format as C, C++ and Java.

37

Example: ex03650001 #!/usr/bin/perl -w00020003 ###########0004 # File: ex03650005 # Demo of 'for' loop0006 ###########00070008 #print out the numbers 3 to 60009 for ($i=3; $i <=6; ++$i) {0010 print $i, "\n";0011 }00120013 print "\n";00140015 #print the even number0016 #between 2 and 100017 for ($i=2; $i<10; $i=$i+2) {0018 print $i, "\n";0019 }

• Lines 9 – 11: for loop print number from 3 to 6

• Lines 17-19: for loop prints even numbers between 2 and 10

• OUTPUT:>ex03653456

2468

38

“for each” Loops

foreach $var (list) {

statement_list

}

• Loop for each element in list.

• For each iteration, set $var to be an alias to the next element in the list.

• See ex0355

39

Pattern Matching

• “//” is the pattern matching operator - used to match regular expressions.

• /good/ - match on literal string “good”• if ($myVar =~ /good/)

– true if $myVar contains “good” (e.g. “good dog”, “goody”)

– “=~“ is the pattern binding operator

• if (/good/)– true if default string ($_) contains “good”.

40

Regular Expressions

• Previous slide showed matching on literals.• We can also match on regular expressions:

– /a[a-g]/ - match on a string that contains a substring that starts with “a” and is followed by a letter between “a” and “g”, inclusive. Example: “ab”

– /a[a-g]*z/ - match on a string that contains a substring that starts with “a”, followed by zero or more characters from “a” to “g” inclusive and ends with “z”. Examples: “aaz”, “abz”, “yabababz”, “gaz”

– /a[a-g]+z/ - match on a string that contains a substring that starts with “a”, followed by one or more characters from “a” to “g” inclusive and ends with “z”. Examples: “aaz”, “abz”, “yabababz”, NOT “gaz”

41

Example ex03700001 #!/usr/bin/perl -w00020003 ###########0004 # File: ex03700005 # Demo of if, elsif, unless0006 ###########0007 $_ = $ARGV[0];0008 if ($ARGV[0] =~ /a[a-g]/){0009 print "$ARGV[0] is in the ";0010 print "language \"a[a-g]\"\n";0011 }0012 if (/a[a-g]*z/){0013 print "$ARGV[0] is in the ";0014 print "language \"\[a-g]*z\"\n";0015 }0016 if (/a[a-g]+z/){0017 print "$ARGV[0] is in the ";0018 print "language \"a[a-g]+z\"\n";0019 }

• Line 7: assign the first command line argument to the default string.

• Examples:

$ex0370 abab is in the language "a[a-g]“

$ex0370 azaz is in the language "[a-g]*z“

$ex0370 abzabz is in the language "a[a-g]"abz is in the language "[a-g]*z"abz is in the language "a[a-g]+z"

42

Man Pages

• Man pages are online documents that describe the use of commands, system calls and other functions.

• All Unix systems have a set of man pages for Unix commands, system calls, functions etc.

• Applications may also come with their own set of man pages which are usually maintained in an area separate from system man pages.

43

Man Page Sections

• Man Pages are broken up into different categories.

• The categories are identified by section number (Linux and Solaris):

Section Contents

1 User Commands

1m Admin Commands

2 System Calls

3 Functions

4 Configuration Files and formats

5 Miscellaneous

6 (1) Games, Demos

7 (9) Special Files and Hardware

8 Maintenance Commands

44

Man Page Usage

• To use, simply type: man command• Example: man sleep• Sometimes a name will appear in more than one

section (name maybe command and function).• To specify a specific section to search, type:

man –s2 time (will show system call version instead of command version)

• Solaris uses lower case ‘s’ and Linux uses capital ‘S’ in –s option

45

More Than One Set

• It is quite common that applications have their own sets of man pages.

• If many applications are installed, users may be interested in having access to multiple sets of man pages.

• The different sets of man pages that will be searched and the order they are searched are stored in the environment variable: $MANPATH

46

More Than One Set

• A user may add a new set by appending the path of the man pages to $MANPATH.

• Example:MANPATH=$MANPATH:$LOGNAME/itec400/man

export MANPATH

47

How Do You Create Your Own Man Pages

• First, you need to create a directory to hold the man pages:mkdir ~/itec400/man

• Next, you need to create subdirectories for those sections that might have man pages.

• Assume you will only have commands:mkdir ~/itec400/man/man1

48

How Do You Create Your Own Man Pages

• Next you need to create a file that describes the command.

• Assume the command name is ‘mycommand’• the man file name for this command would be:

‘mycommand.1’• So, ‘mycommand.1’ would be stored in

~/itec400/man/man1• Finally, we need to change $MANPATH:

MANPATH=$MANPATH:~/itec400/manexport MANPATH

• Now we can type: man mycommand

49

How Do You Create Your Own Man Pages

• Man page files are text files, however, they use a special formatting language: nroff

• nroff has its man page

• Sometimes it is easiest to copy and modify the source file of an existing man page

• For example, the source file for gcc is:/usr/local/man/man1/gcc.1

50

References

• “Programming Perl”, Larry Wall, Tom Christiansen and Jon Orwant, 2000

• “Essential System Administration”, by Aeleen Frisch, 2002

Recommended