返回列表 回复 发帖

[转帖]简易perl 语法

底下利用一些例子,逐步介绍 Perl 的使用
从变量的定义到流程、循环的控制..
-----------------------------------------------------------------------
1. array 的定义
perl 叙述式均得以 ; 分号结尾

@command = ("start", "stop", "draw", "exit");

-----------------------------------------------------------------------
2. 数字的定义

$num = @command;
$number = 30;

-----------------------------------------------------------------------
3. 简单的打印字符串
$command[0] 第一个array的值

print "There are $num commands. The first command is : $command[0]\n";

-----------------------------------------------------------------------
4. @command 代表整个 array

print "@command\n";

-----------------------------------------------------------------------
5. 用 $ENV{variable} 可以取得目前的变量名称

print "your shell is $ENV{SHELL}\n";

-----------------------------------------------------------------------
6. $$ 代表目前的 PID

print "\$\$ = $$\n";

-----------------------------------------------------------------------
7. @ARGV 是全部的参数 @ARGV[0] 是第一个参数 , @ARGV[1] 是第二个参数

print "\@ARGV = @ARGV \n";

-----------------------------------------------------------------------
8. $< 是该使用者的 UID

print "\$\< = $<\n";

-----------------------------------------------------------------------
9. $? 代表传回来的 status 值 0 表示成功, 其它都是失败

print "\$\? = $?\n";

-----------------------------------------------------------------------
10. 简单的 if 语法,与比较

if ($ENV{LOGNAME} eq "xfish")
{ print "ok. \n"; }

-----------------------------------------------------------------------
11. 几个简单的计算
+ - * / 四则运算

$x = 2;
$y = 3;
$z = $x**$y;
print "$z\n";
$y**=2;
print "$y\n";

-----------------------------------------------------------------------
12. 将 commands 这个 array 的值都清除

@commands = ();

-----------------------------------------------------------------------
13. 连接两个字符串,使用 . (一点), 如下, message = Hello, World!

$part1 = "Hello, ";
$part2 = "World! ";
$message = $part1.$part2;
print "$message\n";

-----------------------------------------------------------------------
14. 不懂,但是最后会印出 65 个 * 号

$marker = "*";
$marker x= 65;
print "$marker\n";

-----------------------------------------------------------------------
15. 两个宣告 array 的表示

底下会印出 0 1 2 3 4 5 6 7 8 9
@numberall = (0..9);
print "@numberall\n";

底下会印出 A B C D E F .......... Z
@captial = ('A'..'Z');
print "@captial\n";

-----------------------------------------------------------------------
16. 利用 <STDIN> 读取使用者输入
数字的比较 > < == >= <=
字符串的比较 <STDIN> eq "xfish"

print "Input one integer: ";
if ( <STDIN> > 20 )
{ print "gt 20\n"; }


-----------------------------------------------------------------------
17. 读取 stand input 并且利用 chop 将输入的字符串之后删除
取得完整且精简的 os_version

print "Enter version number:";
$os_version = <STDIN>;
chop $os_version;

-----------------------------------------------------------------------
18. 承接 17, 作更多层的比较 && = and , || = or

if ($os_version >= 10) { print "No upgrade necessary \n"; }
elsif ($os_version >= 6 && $os_version < 9) {print "Standard upgrade \n";}
elsif ($os_version > 3 && $os_version < 6) {print "Reinstall \n";}
else { print "Sorry, can't upgrade \n";}

-----------------------------------------------------------------------
19. 简单的 while 语法使用,从 stand input 读入输入,存入 $in
若输入的字符串【类似】 exit 或 Exit 则跳出程序
应该也可以改成 第 20 项, 顺便说明 $_ 的妙用
=~ 相似
=! 不相似
[eE] 表示 e 或 E 都可以

while ($in = <STDIN>)
{
if ($in =~ /[eE]xit/)
{
print "Ok. exit\n";
exit;
}
print $in;
}

-----------------------------------------------------------------------
20. 应该与 19 有相同的结果, 主要不同在于变量的不同 $in 与 $_

while (<STDIN>)
{
if ($_ =~ /[eE]xit/)
{
print "Ok. exit\n";
exit;
}
print $_;
}

-----------------------------------------------------------------------
21. 再看一个 $_ 及 STDIN 的例子

while (<STDIN>)
{
print $_;
if ( $_ > 10 )
{
print "large than 10\n";
}
}
-----------------------------------------------------------------------
22. shift 的用法,将 @cmdarg 一个一个印出后,舍去

@cmdarg = ("xfish", "dino", "carrie");
while (@cmdarg)
{
$arg = shift @cmdarg;
print "$arg\n";
}

-----------------------------------------------------------------------
23. while (1) 使得程序执行不断
并从事计算工作,当 $i == 5 时用 next 从头执行
$i > 10 时用 last 跳出回圈
next 用法同 continue , last 用法同 break
所以从 1+2+3+4+6+7+8+9+10 = 50

while (1)
{
$i=$i+1;
if ($i == 5) { next; }
if ($i > 10)
{ print "$i out\n";
last;
}
$sum=$sum+$i;
}
print "$sum\n";

-----------------------------------------------------------------------
24. FOR 回圈的用法,类似 C language 底下包括 25 项,都得到相同结果

for ($i=0, $sum=0 ; $i <= 5 ; $sum = $sum + $i , $i = $i + 1)
{ print "$isum |"; }
print "\n$sum\n";

for ($i=0, $sum=0 ; $i <= 5 ; $i = $i + 1)
{ $sum = $sum + $i; }
print "$sum\n";

-----------------------------------------------------------------------
25. FOREACH 回圈的用法,类似 FOR, 得到与 24 项相同的结果

foreach $j (1..10)
{ $sum1 = $sum1 + $j; }
print "$sum1\n";

foreach (1..10)
{ $sum2 = $sum2 + $_ ; }
print "$sum2\n";

-----------------------------------------------------------------------
26. goto 的用法,应该很简单, 定义一个 TAG, 然后就可以 goto TAG
可以尝试一下没有加 chop $offset 时,会多一行空白也就是 \n

ReEnter:
print "Enter offset: ";
$offset = <STDIN>;
chop $offset;
unless ($offset > 0 && $offset < 512)
{
print "Bad offset: $offset\n";
goto ReEnter;
}

-----------------------------------------------------------------------
27. 一个更大的 while 回圈,底下的 28 也是相同的程序
相差在 $input 与 $_ , $_ 真的相当好用
并且示范简单的 system 执行外部程序
还有 unless (condition){action} 的语法, 除非 condition 成立
否则都执行 action

$prompt = "Command (or \"exit\"): ";
print $prompt;

while ($input = <STDIN>)
{
chop $input;
if ($input eq "exit")
{ exit 0;}

system $input;
unless ($? == 0)
{ print "Error executing: $input\n";}
print $prompt;
}

-----------------------------------------------------------------------
28. 可得到与 27 项相同的结果,主要差异在于变量的定义 $input , $_

$prompt = "Command (or \"exit\"): ";
print $prompt;

while (<STDIN>)
{
chop;
if ($_ eq "exit")
{ exit 0;}

system $_;
unless ($? == 0)
{ print "Error executing: $_\n";}
print $prompt;
}

-----------------------------------------------------------------------
29. 再看一个 if , 字符串相等 eq 的范例

$user = $ENV{LOGNAME};

if ( $user eq "root" ) { print "Starting simulation...\n"; }
else
{
print "Sorry $user, you must be \"root\" to run this program.\n";
exit;
}

-----------------------------------------------------------------------
30. 与 29 相同的结果,只是利用 unless 来处理

$user = $ENV{LOGNAME};
unless ( $user eq "root")
{
print "You must be \"root\" to run this program. \n";
exit;
}

-----------------------------------------------------------------------
31. 档案的开启与打印

open (PWDFILE, "/etc/passwd");
while (<WDFILE>) { print $_ ; }
close PWDFILE;

-----------------------------------------------------------------------
32. 档案的开启与打印之二 , 相同的结果,不同的部份在于 $_ 与 $input

open (PWDFILE, "/etc/passwd");
while ($input = <WDFILE>) { print $input ; }
close PWDFILE;

-----------------------------------------------------------------------
33. 将 /etc/passwd 内没有指定 shell 的使用者输出到 output 档案

open (PWDFILE, "/etc/passwd");
open (RESULT, "> output");

while (<WDFILE>)
{
if ($_ =~ /:\n/) { print RESULT $_;}
}

close PWDFILE;
close RESULT;

-----------------------------------------------------------------------
34. foreach 与 file 的操作,底下的范例会寄信给 root, xfish 一封信
  信的内容则为 print 哪一行
重要的观念:
  开启档案若是以 | 开头,则表示不会产生一个档案,
 而是去执行 | 之后的命令 

foreach ("root", "xfish")
{
open (MAILPIPE, "| mail $_");
print MAILPIPE "Remember to send in your weekly report today! \n";
close MAILPIPE;
}

-----------------------------------------------------------------------
35. | 在前面表示这也是一个命令,但与前面不同
  在前面是先执行,所以有 output
在后面时则通常用于没有 output 的处理
批注部份为进一步的变化

open (PSFILE, "ps -de |");
#open (PSFILE, " ps -de | grep inetd | ");
while (<PSFILE>)
{
print $_;
}

-----------------------------------------------------------------------
36. Sub_routine 的使用,几个技巧性的说明如下:
(1) sub 用来定义一个 sub_routine
(2) @_ 表示由 sub_routine 读进来的参数 array
($first, $last) = @_ ; 表示读进来两个参数,一个命名为 $first,
另一个命名为 $last.
(3) local 的意思表示 $first, $last 只有在 local 有用
    否则不加 local 则表示该变量为 globel 的变量
(4) 要执行一个 sub_routine 必须使用 &sub_routine

sub hello
{
($first, $last) = @_;
#local ($first, $last) = @_;
print "Hello, $first $last \n";
}

$a = "Jane";
$b = "Doe";

&hello($a, $b);
print "$first\n";

                     我是一个呼吸着现在的空气而生活在过去的人
               这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
                                     我已习惯了孤独,爱上孤独
                                 他让我看清了自我,还原了自我
                             让我再静静的沉思中得到快乐和满足
                                   再孤独的世界里我一遍又一遍
                                   不厌其烦的改写着自己的过去
                                             延伸到现在与未来
                                       然而那只是泡沫般的美梦
                                 产生的时刻又伴随着破灭的到来
                         在灰飞烟灭的瞬间我看到的是过程的美丽
                                      而不是结果的悲哀。。。
返回列表