2

greenbeansneedlesΛογισμικό & κατασκευή λογ/κού

13 Δεκ 2013 (πριν από 3 χρόνια και 6 μήνες)

59 εμφανίσεις

CSC3530

Software Technology

Tutorial Two

PERL Basics

PERL Basics

Practical Extraction and Report Language

It is interpreted (no need to compile)

Java is something in between, both compile
and interpreted

Syntax similar to C language

Loosely typed language

No type like int, double, char, BOOL

Why Perl for CGI?

For the same CGI program, Perl is much
shorter than C


Simple Example

#!usr/bin/perl

w


# this is a simple hello program

print ‘Hi, I am computer. What’s your name?’;

$name=<STDIN>;

chomp $name;

print “Hi $name, nice to meet you
\
n”;

exit(0);

#!usr/bin/perl

w

Location of perl interpreter, use whereis perl to get it

-
w switch to enable warning

Place your comment after #

All statements end with ;

Cont’d

print


function to print strings to standard
output (monitor)

$name


all scalar variables in perl start
with $

<STDIN>
-

read input from standard input
(keyboard)

<FILE>
-

file handle to read input from file,
will be described later

chomp


function to remove new line
character (
\
n)

exit


end the program

Properties of Perl

Function call may or may not need ()

No main function

Do not need to declare variable at first

Strings are enclosed by “” or ‘’

“” will try to evaluate variable inside e.g. “Hi,
$name” while ‘Hi, $name’ will not

This is call variable interpolation

+,
-
,*,/,% similar to C

** means to the power of, e.g.

$eight=2**3; # $eight will be 8

Boolean in Perl

Things in Perl that considered as false

Number zero

$false=0;

Empty string

$false=“”;

String zero

$false=“0”;

Undefined

$false;

Comparison

==, >, <, >=, <=, !=, eq, gt, lt, ge, le, ne

Logical operator

&&, ||, !, and, or, not

Short circuit

open (FH,”file.txt”) || die “cannot open file”

If file open is successful, the later statement will not
be executed, otherwise, it will be executed and
program terminated

Array in Perl

Array in Perl start with @ e.g.

@terms=(‘RSA’,’DES’,’OLAP’,’OSI’,’Middleware’);

for ($i=0;$i<=$#terms;$i++) {


print “$terms[$i] ”;

}

Output:


> RSA DES OLAP OSI Middleware

$terms[$i]


the (i+1)
th

element, array in
perl counts from 0

$#terms returns the index of the last
element in the array

Can be replace by

@terms=qw(RSA DES OLAP OSI Middleware);

qw is a function : quote word

Cont’d

Another way to do this

@terms=qw(RSA DES OLAP OSI Middleware);

foreach $item(@terms) {


print “$item “;

}


# more straight forward


foreach (@terms) {


print “$_ “;

}

Both are the same, $_ is a special
variable, many functions use it as
default parameter,we will talk about
this later, perhaps

Flow of Control

Most are similar to C

if (condition) {statement}

elsif (condition) {statement}

else {statement}

while (continuing condition) {statement}

for (A;B;C) {statement}

A


initialization

B


continuing condition

C


statement to be executed every iteration

Breaking the loop

last


similar to break in C

next


similar to continue in C


Cont’d

Two examples

while ($i<15) {


last if ($i==7);


$i++;

}

# $i in here equal 7;


for ($i=0; $i<100; $i++) {


next if (not $i % 2);


print “An odd number =$i
\
n”; #only odd number goes here

}

FILE I/O

Simple file copy program

#!/usr/bin/perl

w

open(SOURCE,‘c:
\
\
sourcefile.txt’) || die ‘Cannot open source’;

open(DEST,’>c:
\
\
destfile.txt’) || die ‘Cannot open dest’;

@contents=<SOURCE>;

#read all the lines into array

print DEST @contents;

#print all the lines

close(SOURCE);

close(DEST);

#can be shorter, replace 2 lines by: print DEST <SOURCE>;

> sign is to indicate we want to write
something to this file

@contents=<SOURCE> is a little bit lazy, you
may use a for loop instead

print DEST @contents is to print all lines to
the DEST file handle, if we omit it, the default
is STDIN (monitor)

Hash structure

Hash is like a table lookup

e.g. telephone directory

Hash structure begins with %

%name=(‘3530’, ‘software technology’, ‘5280’, ‘image processing’,
‘5110’, ‘advance software eng.’);

print “3530: $name{‘3530’}
\
n”;

print “5280: $name{‘5280’}
\
n”;

Output:

3530: software technology

5280: image processing

Course codes are key, while course names
are values

Key value pair can be added dynamically

$name(‘5180’)=‘data mining’; #a key value pair is added

Dickson

26098402

Richard

26098403

Nelson

26098431

{
‘3530’
}

More about hash

print “We have these keys in our hash table
\
n”;

foreach $key (keys %name) {


print “$key
\
n”;

}


print “We have these values in our hash table
\
n”;

foreach $value (values %name) [


print “$value
\
n”;

}


If (exists $name{‘5120’}) {


print “we have key 5120 in the hash table
\
n”;

} else {

`

print “we do not have key 5120 in the hash table
\
n”;

}

#correct ways to check whether the key,value pair exist


Split, Join

Given a query string, How to retrieve
the value input by user?

ID=LJ4000&Category=printer&Price=700

$string=$ENV{‘QUERY_STRING’};

#get the query string

@pair=split(/&/,$string);

for each(@pair) {


($name,$value)=split(/=/,$_);


print “$name = $value
\
n”;

}


Output:

ID = LJ4000

Category = printer

Price = 700

Join will be discussed later in this
tutorial

Functions (sub
-
routine)

Perl allow recursion

Functions in perl are defined like:

sub function_name {


statements;

}

Argument stored in @_ (a special array
variable)

You do not need to specify the number of
argument

Handle this carefully, you should know what
you are doing

Argument are all passed by reference

Better use
my

to declare local variable

More about function

sub mean {


my (@data)=@_;

# my


indicate a local variable


my $sum;


foreach (@data) {



$sum+=$_;


}


return ($sum/@data);

}


sub compare {


my ($a, $b)=@_;

# a way to retrieve parameters


if ($a>$b) {



return (1);


} elseif ($a<$b) {



return (
-
1);


} else {



return (0);


}

}

Basic CGI

We will introduce a perl CGI example
that enable you to get values from a
form and manipulate.

www2.cse.cuhk.edu.hk/~csc3530/student_data.htm
,

use
proxy.cse.cuhk.edu.hk

and port
8000

use view source to check HTML code

Name: id

Name: name

Name: major

Name: level

Name:
csc1500,csc2510,csc2520

Simple example

#!/usr/local/bin/perl5
-
w


use CGI qw(:standard);

# use the CGI module

use strict;


# variable declaration more strict


sub no_input {


print header();

# Content
-
type:…..


print start_html('Error');


print qq(<p>No input parameter</p>);


print end_html();

}


if (!param) {


# check input parameter


no_input;

} else {


my $id=param('id');


my $name=param('name');



Cont’d


my $major=param('major');


my $level=param('level');


my $csc1500=param('csc1500');


my $csc2510=param('csc2510');


my $csc2520=param('csc2520');

# get values


open (STAT,">>/uac/cprj/csc3530/www/cgi
-
bin/stat.txt");


my $data=join (',',($id, $name, $major, $level, $csc1500,
$csc2510, $csc2520));


print STAT "$data
\
n";


close (STAT);


print header();


print start_html('Statistic');


print qq(<p>Thanks for your support!</p>);


print end_html();


}


Next Week

Issues on making CGI to work

Servers in CSE

In depth discussion of CGI
programming

Example similar to project

Supplier database

SQL


(may be)

insert, update, select