Learning Perl 4
发布时间:2020-12-16 00:38:19  所属栏目:大数据  来源:网络整理 
            导读:1. 控制结构 所有控制结构都可以做条件修饰符:command if (); unless(){} 等同于if(! ){} unless(){}else{} until(){} 等同于while(! ){} {} 裸块,可以用来限定my修饰符 if(){}elsif(){}...else{} ++i,i++ foreach (@mylist){print $_}; for(;;){} foreach
                
                
                
            | 1. 控制结构 所有控制结构都可以做条件修饰符:command if (); 
  unless(){} 
  等同于if(! ){} 
 
  unless(){}else{} 
   
 
  until(){} 
  等同于while(! ){} 
 
  {} 
  裸块,可以用来限定my修饰符 
 
  if(){}elsif(){}...else{} 
 
  ++i,i++ 
 
  foreach (@mylist){print $_}; 
 
  for(;;){} 
  foreach和for等价,如果没有分号的for(1..10)就是纯正的foreach循环。 
 
  循环控制last=break; next=continue; redo=立即返回本次循环的顶端。 
 
  通过标签从内层对外层的循环快进行控制(通过lash,next,redo),例如: 
 
  LINE: 
  while(<>) { 
  
  foreach(split) 
  { 
  
  last LINE if /__END__/; 
  
  } 
  
  } 
 
  三木运算符 
  ?: 
  
  多分支三目: 
  
  my $size= 
  
  ($width < 10) ? "small" 
  : 
  
  ($width < 20) ? "medium": 
  
  ($width < 50) ? "large" 
  : 
  
  "extra-large"; 
  #default 
 
  使用逻辑或添加默认值: 
  
  my $last_name = $last_name{$someone} || '(No last name)'; 
 
  ? 
  
 2. 模块:可以从CPAN search或者kobes's search网站上下载 
 
  (1). 
  安装$perl Makefile.PL PREFIX=/Users/fred/lib 
  #路径 
  $make install 
 
  (2). 
  使用模块 
  
  use File::Basename 
  
  my $name = "/usr/local/bin/perl" 
  
  my $basename = basename $name 
 
  加入导入列表import list来指明它提供哪些函数,它就不会给你别的函数了。 
  
  use File::Base qw/ basename /; 
   
 
  如果后面为空(),则不引入任何函数。但是可以用全称的形式访问: 
  File::Basename::dirname $name; 
 
  也可以是qw(:all)。 
  
  use File::Spec; 
  
  use File::Basename; 
  
  ... 
  
  my $new_name=File::Spec->catfile($dirname,$basename); 
  
  rename($old_name,$new_name) 
  
  or warn "Can't rename '$old_name' to '$new_name'"; 
 
  CGI.pm 
  
  或者#!/usr/bin/perl 
  
  use CGI qw(:all); 
  
  print header("text/plain"); 
  
  #和HTML标签同名的函数可以提供使用,例如使用h1()输出H1标记的标题,还可以处理cookie信息,页面重定向以及多重页面表单。 
 
  DBI.pm 
  
  use DBI 
  
  $dbh = DBI->connect($data_source,$username,$password); 
  
  $sth=$dbh->prepare("SELECT * FROM foo WHERE bla"); 
  
  $sth->execute(); 
  
  $st->finish(); 
  
  $dbh->disconnect(); 
 
  ? 
  
 3.字符串处理 
 
  (1). 
  index($main_str,$sub_str) 
  返回$sub_str子串的位置(从0开始计算的)。如果没有找到则返回-1 
  
  rindex($main_str,$sub_str) 
  返回最后一个"$sub_str"出现的位置 
 
  (2). 
  substr($main_str,$initial_position,$length) 
  从$initial_position起取$length长度的字符串 
  
  substr($main_str,$initial_position) 
  直接取到结尾 
  
  $initial_position可以用负数相对位置,例如-3表示倒数第三个字符 
  
  如果字符串是个变量,那么可以修改字符串被选取的部分。 
  
  my $string = "Hello World"; 
  
  substr($string,index($string,"Hello"))="Goodbye"; 
  
  print "$string"; 
  #Goodbye,World。而且被取代的字符串不一定要和原有子串长度相同。 
  
  substr($string,"Hello"),5) =~ s/fred/barney/g 
 
  (3). 
  sprintf同printf,但它返回处理过的字符串,而不是将它打印出来。用于格式化输出数据。 
  
  日期数据my $date_tag = sprintf("%4d/%02d/%02d %2d:%02d:%02d",$yr,$mo,$da,$h,$m,$s); 
  
  财务数据my $financial = sprintf("%.2f",2.49995); 
  #会四舍五入。 
  
  处理大数据: 
  
  my $number = sprintf "%.2f",shift @_; 
  #四舍五入小数部分 
  
  1 while $number =~ s/^(-?d+)(ddd)/$1,$2/; 
  #数值1仅仅是循环主体占位用。添加逗号 
  
  #如果上一次替换成功,循环又会重新开始。直到开头小于4个数字。这样的从小数点倒回操作是s///g无法实现的。 
  
  $number =~ s/^(-?)/$1$/; 
   
 
  ? 
  
 4.排序 
 
  (1).内置的sort是按ASCII码大小进行排序的,不能实现更多的功能。 
 
  (2).需要自己写比较函数,例如 
  
  sub by_number { 
  
  if ($a < $b) {-1} elseif ($a > $b) {1} else {0} 
  
  } 
  
  my @result=sort by_number @somenumber 
  
  这个if三路判断(-1,1)有个方便的缩写: <=> 
  
  例如sort {$a <=> $b} @somenumber; 
 
  (3).哈希按值排序 
   
  
  %my_score = {"barney"=>195,"fred"=>205,"dino"=>30}; 
  
  sub by_score {$score{$b} <=> $score{$a}} 
  #倒序 
  
  my @winners = sort by_score keys %score; 
 
  (4).多值排序 
  
  my @winner = sort by_score_and_name keys %score; 
  
  sub by_score_and_name { 
  
  $score{$b} <=> $score{$a} 
  
  or 
  
  $a cmp $b 
  #还可以N种条件的or组合 
  } 
 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
