Chinaunix首页 | 论坛 | 博客
  • 博客访问: 64433
  • 博文数量: 21
  • 博客积分: 100
  • 博客等级: 民兵
  • 技术积分: 273
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-30 09:56
文章分类

全部博文(21)

文章存档

2013年(18)

2012年(3)

我的朋友

分类: LINUX

2013-08-09 13:17:15


点击(此处)折叠或打开

  1. ****************
  2. 0. chomp
  3. *****************

  4. chomp ($void = <STDIN>
  5. 或者

  6. $void = <STDIN>
  7. chomp $void



  8. STDIN是一个标准输入,提示用户输入一个字符串,但在最后一位会加上\n 换行符号,使用chomp会去掉最后的\n 换行符号。



  9. ********************
  10. 1.    数组
  11. *********************


  12. 数组是从0 1 2 3 开始的一组变量,默认是已空格分隔。

  13. $array[0] = test1
  14. 定义数组0位是test1,

  15. $array[1] = test2
  16. 定义数组1位是test2

  17. Print “$array\n”
  18.  Test1 test2

  19. $array[3] = test4
  20. 前面已经定义了数组这里可以定义4位是test4,$array[2] 是未定义的字符串,不会显示出来,但还是有这一位的。


  21. 函数defined

  22. defined 来说,假如它的参数是定义好的便返回真值,比如$array[0],$array[1],像$array[2]是未定义的,便返回假值。

  23. defined( $array[0] )

  24. 例子:1.1

  25. if (defined( $array[0] ))
  26.     print "true\n";


  27. else
  28.     print "false\n";


  29. 以上例子中,如果$array[0]定义了print:true,如果$array[0]未定义print:false。显然$array[0]已经定义,返回true。


  30. $array[2] = test3
  31. 现在定义$array[2]是test3

  32. 例子:1.2

  33. print "@array\n";
  34. test1 test2 test3 test4

  35. print @array,"\n";
  36. test1test2test3test4

  37. 以上可以看出在使用print函数时,将数组用“”括起来,数组会默认输出用空格隔开,没用“”的将输出一串字符串.


  38. @array[-1]
  39. 这个相当于取这个数组的倒数第一位。

  40. ******************
  41. 2. qw和(...
  42. *******************

  43. qw是用来创建一个数组的

  44. 例子:2.1

  45. touch qw.pl

  46. #!/usr/bin/perl
  47. @array1 = qw(my name is caijiangfeng);
  48. print "\n@array1\n\n";

  49. [root@kingate home]# perl qw.pl

  50. my name is caijiangfeng


  51. 运行脚本qw.pl后输出my name is caijiangfeng

  52. qw定义数组很随意
  53. 可以是

  54.  my name is caijiangfeng !
  55. qw@ my name is caijiangfeng @
  56. qw* my name is caijiangfeng *
  57. qw% my name is caijiangfeng %
  58. qw^ my name is caijiangfeng ^


  59. ..)也是来定义数组的。


  60. 例子:2.2


  61. [root@kingate home]# vi test.pl

  62. #!/usr/bin/perl

  63. @array2 = ('a' .. 'z');
  64. print "\n@array2\n";


  65. [root@kingate home]# perl test.pl

  66. a b c d e f g h i j k l m n o p q r s t u v w x y z

  67. ..)定义了一个范围 输出a-z的所有字母

  68. ****************
  69. 3. push和pop函数
  70. ****************

  71. push(@array,1)
  72. push是在数组array里面的最后以为添加一个元素

  73. pop (@array)
  74. pop是在数组array里取最后一位元素。



  75. *****************
  76. 4 hash 散列
  77. *****************

  78. 例子4.1

  79. ###############################
  80. #!/usr/bin/perl


  81. $name{"caijiangfeng"} = "1";
  82. $name{"wangqian"} = "2";

  83. foreach $onetwo (qw< caijiangfeng wangqian >){
  84.         print "my name $onetwo is $name{$onetwo}.\n";
  85. }

  86. 打印:
  87. my name caijiangfeng is 1.
  88. my name wangqian is 2.



  89. hash可以理解成数组的下标自定义名称的数组。

  90. 首先定义 hash元素
  91. $name{"caijiangfeng"} = "1";

  92. 相当于这个hash元素的键是caijiangfeng值是1.

  93. 也可以这么写:

  94. my %name = (
  95.     "caijiangfeng" => "1",
  96.     "wangqian" => "2",
  97.     "wangjiangtao" => "3",
  98. );


  99. 5. foreach 循环语句

  100. 从4.1例子中可以看出 foreach将数组$onetwo 中的值依次提出来通过print打印出来,知道数组中没有值。


  101. **********************
  102. 6. keys 和 values 函数
  103. ***********************

  104. my %hash = ("a" => 1,"b" => 2,"c" => 3);
  105. my @k = keys %hash;
  106. my @v = values %hash;

  107. print "@k\n";
  108. print "@v\n";


  109. 打印:


  110. c a b
  111. 3 1 2

  112. 可以看出数组k包含了%hash的键,而数组v包含了%hash的值。

  113. 因为perl无法预测hash的存储顺序,所以不会和定义hash时的键的顺序一致,但 函数keys和values函数取得的数组表的键和值还是对应的。





  114. 习题:
  115. 写个程序,输入人名如:feng,fengzi,caijiangfeng,wangsan,feng,feng,fengzi,wangsan 最后输出所有人命输入的次数。



  116. #!/usr/bin/perl
  117. while (1){
  118.         print "please enter:";
  119.         chomp ($name = <STDIN>);
  120.         if ("$name" eq "q"){
  121.                 last;
  122.         }
  123.         if (!(exists $name_list{$name})){
  124.                 $name_list{$name} = 1;
  125.         }
  126.         else{
  127.                 $v=$name_list{$name};
  128.                 $name_list{$name} = ($v + 1);
  129.         }
  130. }
  131. print "###################################\n";
  132. foreach $key (sort keys %name_list) {
  133.         print "$key \t = \t $name_list{$key}\n";

  134. }







  135. ***************
  136. 7. 子程序
  137. ****************
  138. 子程序相当于c语言和shell中的函数

  139. 格式

  140. sub sum {

  141.     print "heloo\n";

  142. }

  143. &sum

  144. 子程序的调用是在前面加个 与符号。

  145. $a=1
  146. $b=2

  147. sub max {
  148.     if ($a > $b) {
  149.         print "$a\n";
  150.     }
  151.     else {
  152.         print "$b";
  153.     }
  154. }


  155. $max

  156. 打印:

  157. 2

  158. 这个是取两个变量的最大值.


  159. 在perl中变量的定义都是全局的.在定义变量时加上my

  160. 以上换成:

  161. my $a = 1;
  162. my $b = 2;

  163. &max中将不会引用$a和$b中的值.



  164. $a = 1;
  165. $b = 2;

  166. sub sum {
  167.     $a + $b;
  168. }

  169. $w = &sum;

  170. print "$w"


  171. 打印:

  172. 3


  173. 可以看出打印的是3 是$a和$b的和.&sum的返回值是3.
  174. 子程序的返回值是最后一个命令的返回值,如果最后一个命令是print


  175. sub sum {
  176.     $a + $b;

  177.     print "$a +b";
  178. }


  179. 掉用这个程序后将会先输出$a+$b,然后返回值是1,说明print输出成功将这个值赋予$w,最后在输出1.


  180. ************
  181. 子程序的参数
  182. ************

  183. perl中子程序的第一个参数是:$_[0] 第二个:$_[1],依次类推.



  184. sub max {
  185.     if ($_[0] > $_[1]) {
  186.         $_[0];
  187.     }
  188.     else {
  189.         $_[1];
  190.     }
  191. }

  192. $n = &max(10,20);

  193. print "$n\n";

  194. 打印:

  195. 20


  196. ***************
  197. 子程序私有变量
  198. ****************


  199. sub max {
  200.     my ($m,$n);
  201.     ($m,$n) = @_;
  202.     if ($m > $n) {
  203.         $m;
  204.     }
  205.     else {
  206.         $n;
  207.     }
  208. }

  209. $n = &max(10,20);

  210. print "$n\n";

  211. 打印:
  212. 20

  213. 这个子程序中的变量$m,$n只在&max中有效.@_是一个默认参数数组.




  214. *****************
  215. 更好的&max子程序
  216. ******************


  217. sub max {
  218.     my($max_so_far) = shift @_;
  219.     foreach (@_) {
  220.         if($_ > $max_so_far) {
  221.             $max_so_far = $_;
  222.         }
  223.     }
  224.     $max_so_far;
  225. }

  226. $s = &max(1,10,2,30,11,100,10,3,4,6)

  227. print "$s\n";

  228. 打印:

  229. 100


  230. my($max_so_far) = shift @_;
  231. 提取数组@_中的第一位赋予$max_so_far作为初始值.







  232. *******************
  233. 正则表达式
  234. *******************

  235. #!/usr/bin/perl -w

  236. while (<>) {
  237.     chomp;
  238.     if (/.*a/) {
  239.         print "$_\n";
  240.     }

  241. }

  242. ctrl+d 结束.

  243. .        匹配一个字符(不包括换行符)
  244. .*        匹配一个或多个字符
  245. .+        匹配最少一个字符
  246. .*a        匹配到最后一个a处(越长越好)
  247. .+a        匹配到最后一个a处(越长越好)
  248. .*?a        匹配到第一个a处(越短越好,最好是一个字符都不匹配)
  249. .+?a        匹配到第一个a处(越短越好,最好是第一个)

  250. m/^abc/        匹配开头为abc的行(通常m可以省略)
  251. /^abc/i        匹配开头是abc或者ABC或者Abc的行,i参数是忽略大写.
  252. /./s        匹配任意(包括换行符,s参数让.匹配任意字符)
  253. /. /x        x参数可以在匹配表达式中加入空格,如果要匹配'空格'需要添加转义符\'空格'.

  254. s/^abc/^ABC/    替换开头是abc的行为字符ABC.
  255. s/abc/ABC/g    替换开头是abc的行字符ABC,g参数为全局参数


阅读(636) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~