Let's PERL ÁÒà¢Õ¹ perl ¡Ñ¹
#2
Posted 21 November 2005 - 04:51 PM
µÑÇÀÒÉÒ¶Ù¡Í͡ẺÁÒãËé ãªé§Ò¹ä´é§èÒ áÅÐ ÁÕ»ÃÐÊÔ·¸ÔÀÒ¾ ÁÒ¡¡ÇèÒ·Õè¨Ðà¹éÒ´éÒ¹¤ÇÒÁÊǧÒÁ
¤Ø³ÊÁºÑµÔËÅÑ¡æ¡ç¤×Í ¤ÇÒÁ§èÒÂ㹡ÒÃãªé§Ò¹, à»ç¹ÀÒÉÒẺ procedural áÅÐ OOP Áտѧ¡ìªÑ¹·ÕèÁÒ¾ÃéÍÁ¡ÑºµÑÇÀÒÉÒ㹡Ò÷ӧҹ¡Ñº¢éÍÁÙÅ·Õèà»ç¹ text áÅÐÁÕâÁÅÙÅãËéãªé ÁÒ¡ÁÒÂ
Language Feature
â¤Ã§ÊÃéÒ§ËÅÑ¡æ¢Í§ÀÒÉÒä´éÂ×ÁÁÒ¨Ò¡ C â´Âà»ç¹ÀÒÉÒ·ÕèÁÕÅѡɳРprocedural, ÁÕ variables, expressions, assignment statements, brace-delimited code blocks, control structure, áÅÐ subroutines.
Perl ä´éÃѺÅѡɳТͧ shell scripting ÁÒàªè¹¡Ñ¹ â´ÂàÃÔèÁááà»ç¹ interpreted ( áµè»Ñ¨¨ØºÑ¹Ãѹ㹠virtual machine àªè¹à´ÕÂǡѺ java) µÑÇá»Ã·Ø¡µÑǨÐÁÕÊÑÅѡɳì (sigil) ¹Ó˹éÒ à¾×èͺ͡ª¹Ô´¢éÍÁÙŢͧµÑÇá»Ã ã¹áµèÅÐ context áÅÐàªè¹à´ÕÂǡѺ Unix shells perl Áտѧ¡ìªÑ¹ÊÓËÃѺ§Ò¹·ÕèãªéºèÍÂæàªè¹ sorting ÁÒãËé
Perl ÁÕ associative arrays ( hash ) «Öè§ä´éÁÒ¨Ò¡ awk áÅÐ Regular Expressions ¨Ò¡ sed «Ö觪èÇÂãËé¡Ò÷ӧҹ¡Ñº text §èÒ¢Öé¹
Perl 5 ÁÕ¡ÒÃà¾ÔèÁàµÔÁ¤ÇÒÁÊÒÁÒö´éÒ¹ complex data structure, first-class function (àªè¹ closure ), ¡ÒÃà¢Õ¹Ẻ OOP ÃÇÁ¶Ö§ reference, packages, class-based method dispatch.
Perl ·Ø¡àÇÍÃìªÑ¹ ÁÕ automatic data typing áÅÐ memory management «Öè§ perl interpreter ¨ÐÃÙéÇèÒµÑÇá»ÃµÑÇä˹ÁÕ¢éÍÁÙŪ¹Ô´ÍÐäà ( int, double or string ) µéͧãªéà¹×éÍ·Õè㹡ÒÃà¡çº¢éÍÁÙÅà·èÒäà â´Â¨Ð¨Í§à¹×éÍ·Õè áÅÐ ¤×¹à¹×éÍ·Õè˹èǤÇÒÁ¨ÓãËéâ´ÂÍѵâ¹ÁÑµÔ (¤ÅéÒÂæ Garbage Collection ã¹ Java ) ¡ÒÃá»Å§ª¹Ô´¢Í§¢éÍÁÙŨзÓãËéâ´ÂÍѵâ¹ÁѵԢ³Ð run time áµè¶éÒ¢éÍÁÙŪ¹Ô´ã´äÁèÊÒÁÒöá»Å§ä´é ¨Ð·ÓãËéà¡Ô´ fatal errors
This post has been edited by TongPha: 21 November 2005 - 04:52 PM
#3
Posted 21 November 2005 - 05:25 PM
àÃÔèÁáá Perl ¶Ù¡¾Ñ²¹Ò¢Öé¹ÁÒà»ç¹ Interpreter «Öè§à¢Õ¹¢Ö鹨ҡÀÒÉÒ C áÅÐÁÕâÁ´ÙÅÁÒ¡ÁÒ·Õèà¢Õ¹¢Ö鹨ҡ perl áÅÐ c Source Distribution 㹻Ѩ¨ØºÑ¹ÁÕ¢¹Ò´»ÃÐÁÒ³ 12 MB ËÅѧ¨Ò¡ÂèÍáÅéÇ µÑÇ interpreter à¢Õ¹¢Öé¹ÁÒ¨Ò¡ÀÒÉÒ C »ÃÐÁÒ³ 150,000 ºÃ÷Ѵ áÅж١ compile ÍÍ¡ÁÒà»ç¹ executable »ÃÐÁÒ³ 1 MB ã¹áµèÅÐ platform áµèÇèÒµÑÇ interpreter ¡çÊÒÁÒö¹Óä» compile à»ç¹ link library áÅÐÃÇÁà¢éÒä»äÇéã¹â»Ãá¡ÃÁÍ×è¹ä´é
µÑÇ interpreter ¶Ù¡Í͡ẺÁÒẺ Object Oriented Architecture Êèǹ»ÃСͺÀÒÂ㹢ͧ perl ¶Ù¡à¢Õ¹¢Öé¹ÁÒâ´Âãªé C struct ¡Ò÷ӧҹ¡Ñºâ¤Ã§ÊÃéÒ§àËÅèÒ¹Ñé¹¶Ù¡à¢Õ¹¢Öé¹â´Âãªé macros, typedefs áÅÐ functions «Öè§ÃÇÁ¡Ñ¹à»ç¹ Perl C API
¡Ò÷ӧҹ¢Í§ Perl program ¨Ðáºè§ÍÍ¡à»ç¹ 2 ¢Ñ鹵͹
1. compile-time : perl interpreter ¨Ð parse text file ÍÍ¡à»ç¹ syntax tree
2. run-time : perl interpreter ¨ÐÃѹâ»Ãá¡ÃÁâ´ÂÃѹ¤ÓÊÑè§µÒÁ tree ·Õèä´é¨Ò¡¢Ñé¹ 1
â´Â·Õè perl interpreter ¨Ð·Ó¡Òà parse text file à¾Õ§¤ÃÑé§à´ÕÂÇ áÅзӡÒà optimize syntax tree ¡è͹·Õè¨Ð execute ¡ÒÃ·Ó compile-time optimizations »ÃСͺ´éÇ constant folding, context propagation áÅÐ peephole optimization
Perl ÁÕÅѡɳРcontext-free grammar «Öè§äÁèÊÒÁÒö parse ´éÇ Lex/Yacc ẺÀÒÉÒ·ÑèÇæä» áµèä´éÊÃéÒ§ lexer ¢Öé¹ÁÒãËÁè â´Â¡ÒÃá¡éä¢ GNU Bison à¾×èÍÊÒÁÒöÃͧÃѺ¤ÇÒÁ«Ñº«é͹¢Í§ Perl â´ÂÁÕ¤Ó¡ÅèÒÇÇèÒ
only perl can parse Perl
«Öè§ËÁÒ¤ÇÒÁÇèÒ ÁÕáµè Perl Interpreter à·èÒ¹Ñé¹·ÕèÊÒÁÒöá»ÅÀÒÉÒ Perl ä´é
#4
Posted 21 November 2005 - 05:34 PM
â¤Ã§ÊÃéÒ§ÀÒÉÒ (Language Structure)
µÑÇÍÂèÒ§â»Ãá¡ÃÁ Hello World!!
#!/usr/bin/perl -w print "Hello, World!!\n";
ºÃ÷Ѵáá ¨ÐºÍ¡ÇèÒµÑÇ perl interpreter ÍÂÙè·Õèä˹ ÅѡɳÐà´ÕÂǡѹ¡Ñº shell script ÊèǹºÃ÷Ѵ·ÕèÊͧ¨Ð¾ÔÁ¾ì¤ÓÇèÒ Hello, World!! ÍÍ¡ÁÒ ¾ÃéÍÁ·Ñé§¢Ö鹺Ã÷ѴãËÁè (\n)
ã¹Ãкº Windows »¡µÔ¨ÐàÃÕ¡ãªéâ»Ãá¡ÃÁµÒÁ¹ÒÁÊ¡ØÅ¢Í§ä¿Åì «Öè§µÑÇ perl installer ¨Ðá¡éãËéáÅéÇâ´Â»¡µÔ ÊÒÁÒöà¢Õ¹ºÃ÷ѴááẺ¹Õé
#!perl
ËÃ×ÍàÃÒÊÒÁÒöà¢Õ¹â»Ãá¡ÃÁẺÃǺÃÑ´ä´é¨Ò¡ command line Ẻ¹Õé
perl -pe 'tr/A-Z/a-z/' < input_file > output_file
#5
Posted 21 November 2005 - 05:58 PM
Perl ÁÕª¹Ô´¢Í§¢éÍÁÙŴѧ¹Õé
1. Scalar : à¡çº¤èҢͧ¢éÍÁÙÅà´ÕèÂÇ (àªè¹ number, string, reference )
2. List ËÃ×Í Array : à¡çº¢éÍÁÙÅ Scalar ẺàÃÕ§ÅӴѺ
3. Hash or Associative Array : ¤ÅéÒ¡Ѻ Array áµèãªé string à»ç¹ index 㹡ÒÃà¢éÒ¶Ö§¢éÍÁÙÅ â´ÂàÃÕ¡ string ¹Ñé¹ÇèÒ Key áÅÐàÃÕ¡¢éÍÁÙÅ·Õè key ªÕé ÇèÒ Value
µÑÇá»Ã·Ø¡µÑǨж١¹Ó˹éÒ´éÇÂÊÑÅѡɳì¾ÔàÈÉ (sigil) «Ö觨к͡¶Ö§ª¹Ô´¢Í§¢éÍÁÙÅ áÅÐ µÑÇá»Ãª×èÍà´ÕÂǡѹáµè ¤¹ÅЪ¹Ô´ ¨ÐËÁÒ¶֧ µÑÇá»Ã ¤¹ÅеÑÇ
$foo; # Scalar @foo; # Array %foo; # Hash
¤èÒµÑÇàÅ¢ ¨Ðà¢Õ¹àËÁ×͹¡ÑºÀÒÉÒÍ×è¹ string ¨Ð¤ÃèÍÁ´éÇ quote ẺµèÒ§æ
$n = 100; $name = "peter"; $color = 'red';
list ¢Í§¢éÍÁÙŨÐà¢Õ¹â´Â à¢Õ¹¢éÍÁÙÅáµèÅеÑÇ á¡¡Ñ¹´éÇ comma ÍÂÙèÀÒÂ㹠ǧàÅçº ( )
@scores = ( 24, 46, 35, 18 );
à¹×èͧ¨Ò¡¢éÍÁÙŪ¹Ô´ Scalar à¡çºä´é·Ñé§ µÑÇàÅ¢ text ËÃ×Í reference àÃÒ¨Ö§ÊÒÁÒöÃÇÁ¢éÍÁÙŵèÒ§ª¹Ô´à¢éÒä»ã¹ list à´ÕÂǡѹä´é
@mixed = (15, 3.1416, "tom", \$ref );
¢éÍÁÙÅáµèÅеÑǢͧ list ÊÒÁÒöà¢éÒ¶Ö§ä´éâ´Âãªé index ·Õèà»ç¹µÑÇàÅ¢ ÍÂÙèã¹ square brackets [ ]
¢éÍÁÙÅáµèÅеÑǢͧ hash ÊÒÁÒöà¢éÒ¶Ö§ä´éâ´Âãªé index ·Õèà»ç¹ key ÍÂÙèã¹ à¤Ã×èͧËÁÒ»ա¡Ò curly braces { }
à¤Ã×èͧËÁÒ $ ·Õè¹Ó˹éÒ ºÍ¡ÇèÒàÃÒà¢éÒ¶Ö§¢éÍÁÙÅ·Õèà»ç¹ Scalar
$scores[2]; # 3rd element of @scores
$favorite{joe}; # a value in ÿ%favorite with key "joe"¢¹Ò´¢Í§ array ÊÒÁÒöà¢éÒ¶Ö§ä´éâ´Â ÍèÒ¹¤èÒ (evaluating) array ã¹ scalar context
Quote
ËÃ×Í ´Ù last array index â´Âãªé $#arr
$lastIndex = $#scores;
¿Ñ§¡ìªÑ¹·Õèãªé¡Ñº list â´Â੾ÒÐ
Quote
$var = pop (@arr); # ´Ö§µÑÇ·éÒÂÍÍ¡
$var = shift (@arr); # ´Ö§µÑÇááÍÍ¡
unshift (@arr); # ãÊèµÑÇáÃ¡ÊØ´
$arr1 = reverse (@arr); # reverse array
$arr1 = sort (@arr); # àÃÕ§¢éÍÁÙÅã¹ array
hash ÊÒÁÒö¡Ó˹´¤èÒàÃÔèÁµé¹ä´éâ´Â list ¢Í§¤Ùè¢Í§ key/value
%favorite = ( joe => 'red', ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿsam => 'blue' );
¿Ñ§¡ìªÑ¹·Õèãªé¡Ñº hash â´Â੾ÒÐ
Quote
@values = values %favorite; # ´Ö§à©¾ÒТéÍÁÙÅ·Õèà»ç¹ value
This post has been edited by TongPha: 25 November 2005 - 06:04 PM
#6
Posted 21 November 2005 - 07:55 PM
´ÕÁÒ¡àŤÃѺ ¢ÍµÔ´µÒÁÍèÒ¹¹Ð¤ÃѺ
#7
Posted 22 November 2005 - 12:41 AM
#8
Posted 22 November 2005 - 03:27 PM
work4best, on Nov 21 2005, 07:55 PM, said:
<{POST_SNAPBACK}>
à˵ؼÅËÅÑ¡¡ç¤×Í
TMTOWTDI
#10
Posted 22 November 2005 - 04:35 PM
perl ÁÕÅѡɳРcontrol structure à»ç¹ block â´Â·Õè à§×èÍ¹ä¢ (conditions) ¨ÐÍÂÙè㹠ǧàÅçº () áÅÐ statements ¨ÐÍÂÙè㹠ǧàÅ纻ա¡Ò { }
Quote
label while ( cond ) { ... } continue { ... }
label for ( init-expr ; cond-expr ; incr-expr ) { ... }
label foreach var ( list ) { ... }
label foreach var ( list ) { ... } continue { ... }
if ( cond ) { ... }
if ( cond ) { ... } else { ... }
if ( cond ) { ... } elsif ( cond ) { ... } else { ... }
statement à´ÕèÂÇæ ¨ÐÊÒÁÒöãÊèà§Õè͹ä¢áººÊÑé¹ä´é
Quote
statement unless cond ;
statement while cond ;
statement until cond ;
statement foreach list ;
#11
Posted 22 November 2005 - 05:17 PM
Quote
results = grep { ... } list;
map à»ç¹àËÁ×͹ẺÂèͧ͢ foreach ¤×ͨÐÃѹâ¤é´¡Ñº¢éÍÁÙÅáµèÅеÑÇ ·ÕèÍÂÙèã¹ list â´ÂàÃÒÊÒÁÒöà¢éÒ¶Ö§¢éÍÁÙżèÒ¹µÑÇá»Ã $_ àÁ×èÍÃѹ¢éÍÁÙŨ¹¤Ãº ¨Ð return list ãËÁèãËé
my @numbers = ( 1, 2, 3, 4 );
my @results = map { $_*2 } @numbers;
print @results; # print 2468¨ÐàËÁ×͹¡Ñº
my @numbers = ( 1, 2, 3, 4 );
my @results = ();
foreach $num (@numbers) {
$num *= 2;
push @results, $num;
}
print @results; # print 2468grep ã¹ perl ·Ó§Ò¹àËÁ×͹¤ÓÊÑè§ grep ã¹ UNIX ¤×ͨÐàÅ×Í¡àÍÒ¢éÍÁÙÅ·Õè match ¡Ñºà§×è͹䢷Õè¡Ó˹´
my @names = ("tom", "jim", "henry", "marry");
my @resutls = grep { "m" } @names;
print "@results"; print tom jim marry
This post has been edited by TongPha: 22 November 2005 - 05:20 PM
#12
Posted 22 November 2005 - 05:58 PM
Subroutine ÊÒÁÒöà¢Õ¹¢Öé¹ä´éâ´Âãªé key word sub áÅÐàÃÕ¡ãªéâ´Â¾ÔÁ¾ìª×èÍ subroutine ·Õèµéͧ¡Òà àÃÒÊÒÁÒöÊÃéÒ§ subroutine ¢Öé¹·Õèã´¡çä´éã¹â»Ãá¡ÃÁ áµè¶éÒàÃÒàÃÕ¡ãªé subroutine ¡è͹·Õè¨Ð»ÃСÒÈ ¨ÐµéͧãÊèǧàÅçº ( ) µèÍ·éÒÂ
foo();
sub foo {
.....
}
foo;
foo();
&foo
&foo();;àÃÒÊÒÁÒöÊè§ arguments ãËé subroutine ä´éâ´Â µèÍ·éÒª×èÍ subroutine ´éÇ µÑÇá»Ã·ÕèàÃÒ¨ÐÊè§à¢éÒä»
foo $a, @b, %c; foo($a, $b, @c); &foo; &foo $a, $b, $c
*parameter ·ÕèÊè§à¢éÒÁÒãËé subroutine ¨ÐäÁèÁÕ¡ÒáÓ˹´ª¹Ô´ áÅÐ㹡ÒÃàÃÕ¡ãªéáµèÅФÃÑé§ äÁè¨Óà»ç¹µéͧÊè§ parameter ¨Ó¹Ç¹·Õèà·èҡѹ â´Â·Õè list ¨Ð¶Ù¡ á¡ÍÍ¡à»ç¹ scalar áÅÐ hash ¨Ð¶Ù¡á¡ÍÍ¡à»ç¹ ¤Ùè¢Í§ key/value áÅÐÃÇÁàÍÒ scalar ·Ø¡Íѹà¢éÒ´éÇ¡ѹà»ç¹ list Êè§ãËé subroutine â´Â·Õè¨Ðà¡çºäÇéã¹ special variable @_
Quote
ÿ ÿ foreach ( @_ ) {
ÿ ÿ ÿ ÿ print ">>>>$_\n";
ÿ ÿ }
}
my @arr = ( 5, 10, 15 );
my %hash = ( 1 => 100, 2 => 200, 3 => 300);
mySub(@arr, %hash);
¨Ðä´é output ÅѡɳйÕé
Quote
>>>>>10
>>>>>15
>>>>>1
>>>>>100
>>>>>3
>>>>>300
>>>>>2
>>>>>200
* ·Õè 3, 300 ÍÍ¡ÁÒ¡è͹ 2, 200 à¾ÃÒÐ hash äÁèä´éàÃÕ§¢éÍÁÙÅẺ list
¶éÒàÃÒÃÙéÇèÒ ÁÕ argumanet ¡ÕèµÑÇ ÊÒÁÒö´Ö§ÍÍ¡ÁÒ·Ñé§ËÁ´·Õà´ÕÂÇä´éàÅ àªè¹ 2 µÑÇ
sub mySub() {
my ($x, $y) = @_;
....
}¡Òà return ¤èÒ¨Ò¡ subroutine
»¡µÔ ¨Ðãªé keyword return 㹡ÒÃÊ觤èÒ¡ÅѺ
Quote
ÿ ÿ if ( .... ) {
ÿ ÿ ÿ ÿ return 0;
ÿ ÿ } else {
ÿ ÿ ÿ ÿ return 1;
ÿ ÿ }
}
㹡óշÕè subroutine äÁèä´éÁÕ¡Òà return ¤èÒ â´Â keyword
*perl ¨ÐÊ觤èÒ·Õèä´é¨Ò¡¡Òà evaluate statement ÊØ´·éÒ à»ç¹¤èÒ return ¨Ò¡ subroutine
sub mySub() {
ÿ ÿlocal @params = @_;
ÿ ÿlocal $a;
ÿ ÿif ( $#params > 0 ) {
ÿ ÿ ÿ ÿtime(); # case 1
ÿ ÿ} else {
ÿ ÿ ÿ ÿ"xx/xx/xx"; # case 2
ÿ ÿ}
}
$x = mySub();case 1 : ¤èÒ $x ¨Ðà»ç¹¤èÒ·Õèä´é¨Ò¡¡ÒÃàÃÕ¡¿Ñ§¡ìªÑ¹ time
case 2 : ¤èÒ $x ¨Ðà»ç¹¤èÒ string "xx/xx/xx"
This post has been edited by TongPha: 25 November 2005 - 06:11 PM
#13
Posted 23 November 2005 - 06:17 PM
perl ÊÒÁÒöÊÃéÒ§ anonymous subroutine (unnamed) ä´éàªè¹à´ÕÂǡѺ Java â´Â ¡Ó˹´¤èÒãËéµÑÇá»Ãá·¹
Quote
&$subref;
¡ÒÃà¢Õ¹ÅѡɳйÕé ¨Ðà»ç¹¡ÒÃ·Ó subroutine à»ç¹ private ¤×Í code Êèǹ·Õèà¢éÒ¶Ö§ $subref ä´éà·èÒ¹Ñé¹ ·Õè¨ÐàÃÕ¡ãªé subroutine ¹Õéä´é
*¡ÒÃàÃÕ¡ãªé anonymouse subroutine µéͧãªéà¤Ã×èͧËÁÒ & ¹Ó˹éÒ·Ø¡¤ÃÑé§
This post has been edited by TongPha: 23 November 2005 - 06:24 PM
#14
Posted 25 November 2005 - 06:48 PM
Perl ÁÕ syntax ¾ÔàÈÉÊÓËÃѺà¢Õ¹ Regular Expression (¢ÍàÃÕ¡ÊÑ鹿ÇèÒ RegEx) áÅÐã¹µÑÇ interpreter ÁÕ engine ¾ÔàÈÉÊÓËÃѺ·Ó RegEx matching â´Âãªé backtracking algorithm «Ö觹͡¨Ò¡¨Ð·Ó simple matching ä´éáÅéÇ ÂѧÊÒÁÒö·Ó string capture áÅÐ substitution ä´é
Perl RegEx syntax àÃÔèÁµé¹ÁÒ¨Ò¡ Unix Version 8 regular expression áÅСçä´éÁÕ¡ÒÃà¾ÔèÁ¤ÇÒÁÊÒÁÒöµèÒ§æà¢éÒä»
m// (match) ãªé㹡ÒÃà»ÃÕºà·Õº string ( m ¨ÐäÁèãÊè¡çä´é ) àªè¹
$x =~ m/abc/;
¨Ðä´é¤èÒ true ¶éÒ $x match ¡Ñº RegEx abc
àÃÒÊÒÁÒöà¡çº string ·Õè match ä´éâ´ÂãÊèǧàÅçº ( ) ¤ÃèÍÁÊèǹ·Õèµéͧ¡Òà â´Â¨Ð return ¤èÒẺ list context àªè¹
Quote
($matched) = $x =~ /r(.)t/;
print $matched; # print "a"
s/// (substitute) ·Ó¡ÒÃËÒ áÅÐ á·¹·Õè string
$x = s/abc/123/; # replace abc with 123
àÃÒÊÒÁÒöãÊè modifiers 㹡ÒÃ·Ó pattern matching ãËé¡Ñº RegEx engine ä´é â´ÂÃкصèÍ·éÒ expression
$x =~ m/abc/i; # case-insensitive $x =~ s/abc/123/g; # global serch&replace
ÊÓËÃѺ RegEx ·Õè«Ñº«é͹ perl ÁÕ /x modifier ãËéãªé «Öè§·ÓãËéàÃÒÊÒÁÒöãÊè comment áÅÐ white space ã¹ RegEx ä´é
$x =~ m/a # match 'a' . # match any character c # match 'c' /x;
This post has been edited by TongPha: 26 November 2005 - 01:19 AM

Help













