perl programming – appendix there ’ s more than one way to do it keep easy things easy and the...
Post on 19-Dec-2015
215 views
TRANSCRIPT
Perl Programming – AppendixPerl Programming – Appendix
There’s more than one way to do it
Keep easy things easy and the hard possible
Com
pu
ter C
en
ter, C
S, N
CTU
2
Problem 1: Regex Example
$_ = “this is a test”;/(\w+)\W+(\w+)/; # match first two words,
# $1 = “this”, $2 = “is”print “$1, $2\n”;
$_ = “this is a sample string”;/sa.*le/; # $` = “this is a ”
# $& = “sample”# $’ = “ string”
Com
pu
ter C
en
ter, C
S, N
CTU
3
Regex Example: Date Extraction
#!/usr/bin/perl $date = `date`; print "$date"; # 2008 年 2 月 29 日 周五 11 時 27 分 16 秒
CST $date =~ /^(\d+)\D+(\d+)\D+(\d+)\S+\s+ 周 (\S+)/; %hash = (
year => $1, month => $2, day => $3, weekday => $4, ); for (keys %hash) { print "$_ => $hash{$_}\n"; }
Com
pu
ter C
en
ter, C
S, N
CTU
4
One-Line Perl Execution
Com
pu
ter C
en
ter, C
S, N
CTU
5
Problem 2: File Handler
An interface to file access
File handler in C
File handler in Perl
File HandlerUser
File Name
Access Mode
Flags
Read, write
FILE *fp = fopen("count.dat","r");fgets(numb, 8, fp);
open FH, “count.dat” or die “open file failure: $!”;$numb = <FH>;
Com
pu
ter C
en
ter, C
S, N
CTU
6
Problem 3: <>
while (<>) { print }
Using diamond operator <>• Get data from files specified on the command line
$ARGV records the current filename@ARGV shifts left to remove the current filename
• Otherwise read from STDIN
while (<FH>) { print }• Read from file handler FH
Com
pu
ter C
en
ter, C
S, N
CTU
7
CPAN
If you see similar errors on execution of perl…
• Your @INC is incorrect, or
• You need to install the required modules
We can install modules from command line tool• cpan
Useful tool to install modules in CYGWIN
Com
pu
ter C
en
ter, C
S, N
CTU
8
On the first use we should set up configuration
<Enter>
Com
pu
ter C
en
ter, C
S, N
CTU
9
<Enter>
<Enter>
Com
pu
ter C
en
ter, C
S, N
CTU
10
Keep <ENTER>…
Com
pu
ter C
en
ter, C
S, N
CTU
11
Change PREFIX!
PREFIX is where to install your modules.If you don’t understand, <ENTER>For non-root users, my setting is ~/perl/module/
Still keep <ENTER> until…
Com
pu
ter C
en
ter, C
S, N
CTU
12
Select the nearest CPAN site
2
Com
pu
ter C
en
ter, C
S, N
CTU
13
Com
pu
ter C
en
ter, C
S, N
CTU
14
Install desired modules:
After installation, type “quit” to leave cpan
Com
pu
ter C
en
ter, C
S, N
CTU
15
Some Useful Built-in
system "tail -20 $ENV{HOME}/mail/procmail.log"; exec “rm -f file”;
sleep 3; select undef, undef, undef, 3;
$char = getc ; perl -e 'system("stty raw");getc‘
exit 1; die “error msg: $!”;
# sleep 3 seconds
# need to wait ENTER
# immediate return on keystroke
Com
pu
ter C
en
ter, C
S, N
CTU
16
Demo: Pdir, BBS like directory handler
Com
pu
ter C
en
ter, C
S, N
CTU
17
Demo: Process Killer
Com
pu
ter C
en
ter, C
S, N
CTU
18
Demo: wxPerl + OpenGL
Com
pu
ter C
en
ter, C
S, N
CTU
19
Demo: Kephra using wxPerl on Windows
Com
pu
ter C
en
ter, C
S, N
CTU
20
Perl Module
We have two files in the same directory• main.pl The main script, will be run as ./main.pl
• Animal/Mouse.pm Definition of perl module
In main.pl,
#!/usr/bin/perl –w
use lib ‘.’; # search path for your modules, see @INC
use Animal::Mouse;
# means module in Animal/Mouse.pm
$mouse = new Animal::Mouse ("Mickey"); In Mouse.pm,
package Animal::Mouse; # must be the same as file name
1;
Com
pu
ter C
en
ter, C
S, N
CTU
21
POSIX
You can use C functions in Perl. perldoc POSIX for list of usable functions.
use POSIX qw(acos setgid uname);• acos(0.5)
• setgid(4)
• if( uname() =~ /linux/i ){…}
Com
pu
ter C
en
ter, C
S, N
CTU
22
IO::Handle
OO interface for file handler use IO::Handle; open SCR, ">/dev/tty";
SCR -> autoflush(1); Flush on every write
STDIN -> blocking(0); Non-blocking read
$line = <STDIN>;
Normal write: Buffer data until “\n” written Auto flush write: Write without waiting Normal read: block and wait until “\n” received Non-Blocking read: return immediately without waiting
Com
pu
ter C
en
ter, C
S, N
CTU
23
IO::Select -1
OO interface to the power tool select
Assume we are using non-blocking reads. Read by Polling
• Write a loop to query data on your own
Read by select• Process incoming data when available
Data GeneratorProgram Query
Data GeneratorProgram Notify
Com
pu
ter C
en
ter, C
S, N
CTU
24
IO::Select -2
$rd_h = new IO::Select($telnet, \*STDIN); while (@ready = $rd_h -> can_read){
for $fh (@ready){
if ($fh == $telnet) { # process telnet socket reads }
else { # process STDIN reads }
}
}
Com
pu
ter C
en
ter, C
S, N
CTU
25
IO::Select -3
use IO::Select; use IO::Socket;
$lsn = new IO::Socket::INET(Listen => 1, LocalPort => 8080); $sel = new IO::Select( $lsn );
while(@ready = $sel->can_read) { foreach $fh (@ready) { if($fh == $lsn) { # Create a new socket $new = $lsn->accept; $sel->add($new); } else { # Process socket # Maybe we have finished with the socket $sel->remove($fh); $fh->close; } } }