设为首页 收藏本站
查看: 1859|回复: 0

[经验分享] Perl Note(1)

[复制链接]

尚未签到

发表于 2015-12-26 13:40:49 | 显示全部楼层 |阅读模式
  特殊的转义字符:
  \l 下个字符小写
  \L接着的字符均小写直到\E

  \u下个字符大写
  \U接着的字符均大写直到\E

  \Q在non-word字符前面加上\,直到\E
  \E 结束\L, \E和\Q
  
  关于undef 和 define 函数

  能返回 undef 的操作之一是行输入操作,<STDIN>。通常,它会返回文本中的一行。但如果没有更多的输入,如到了文件

  的结尾,则返回undef。要分辨其是undef 还是空串,可以使用 defined函数,它将在为undef 时返回false,其余返回true。
  
  如果想声明自己的undef 值,可以使用undef:

  $madonna = undef ; #同$madonna 从未被初始化一样。
  
  反向索引

  如有一rocks 数组,其最后一个元素的索引为$#rocks .一种简便方法:数组的负数索引值从最后一个元素开始。

  
  #pop, push, shift, unshift调用语法

  $barney = pop @array;
  push(@array,0);
  $m = shift (@array);
  unshift(@array,5);

  
  reverse 返回逆转的列表,它不会改变其参数的值。如果返回值没有赋值给某个变量,那这个操作是没有什么意义的:
reverse @fred; #错误,没有改变@fred的值

  @fred = reverse @fred; #改变了@fred的值
  
  #scalar函数强制输出标量

  print &#8220; I have &#8221; , @rocks, &#8220;rocks!"n&#8221; ; #错误,输出 rocks的名字

  print &#8220; I have &#8221; , scalar @rocks, &#8220; rocks!"n&#8221; ; #正确,输出其数字
  
  use strict; #迫使采用更严格的检测
  
  子程序调用省略参数括号

  如果Perl 内部的编译器知道此子程序的定义,则可以省掉其参数的括号,如可以把子程序定义放在调用的前面。
  
  <>操作符输入流

  <>从数组@ARGV中得到调用参数。这个数组是Perl 中的一个特殊数组,其包含调用参数的列表。 <>操作查看@argv 来决定使用哪些文件。如果表为空,则使用标准输入流;否则,使用其找到的相应文件。
  
  printf相关  

  如果宽度值为负数,则为左对齐(对于所有的格式符):
print &#8220; %-15s"n&#8221; , &#8220; flintstone&#8221; ; #输出为flintstone○ ○ ○○
%f根据需要进行截尾,你可以设置需要几位小数点后面的数字:
printf &#8220;%12f"n&#8221;, 6*7 + 2/3; #输出为:   ○ ○ ○42.666667
printf &#8220;%12.3f"n&#8221;, 6*7 + 2/3; #输出为: ○ ○○ ○ ○○ 42.667
printf &#8220;%12.0f"n&#8221;, 6*7 + 2/3; #输出为: ○ ○ ○○ ○ ○○ ○ ○○ 43

  要输出一个百分号,可以使用%%,它不会使用后面列表中的元素
  
  数组与printf
  printf&#8220; The items are:"n&#8221;. (&#8220; %10s"n&#8221;x @items), @items;
  

  Perl自身有六个文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT
  

  open CONFIG, &#8220; dino&#8221; ;#default to be read
open CONFIG, &#8220; <dino&#8221; ;#same as above
open BEDROCK, &#8220; >fred&#8221; ;#write

  open LOG,&#8220; >>logfile&#8221; ;#append
  
  my $success = open LOG, &#8220;>>logifle&#8221;; #将返回值保存在$success中
if(!$success){
#打开失败时
...

  }
  
  die 函数来创建我们自己的严重错误。
  if(!open LOG, &#8220;>>logfile&#8221;){
die &#8220;Cannot create logfile:$!&#8221;;

  }
  
  if open LOG, ">>logfile" or
  die "Cannot create logfile:$!";

  
  warn 函数像 die 那样工作,除了最后一步,它不会从程序中退出。
  
  默认情况下,如果不指定文件句柄给 print(或者 printf,这里的内容对两者均适用),则默认会使用 STDOUT。但这个默认属性,可以通过select 操作进行更改。如下:
select BEDROCK;
print &#8220; I hope Mr. Slate doesn&#8217; t find out about this."n&#8221; ;

  print &#8220; Wilma!"n&#8221;
  
  将变量$|设置为1,将会在输出操作结束时会立刻清空文件句柄。 (I tried, but it didnot work.)

  
  
  
  
  Hash操作

  要访问hash 元素,可以使用下面的语法:

  $hash{$some_key}
  
  将hash 转变成其它形式更加常见。例如,我们可以将hash 反转:

  %inverse_hash = reverse %any_hash;
  
  keys函数会返回此 hash 的所有keys,values函数将返回所有的 values。如果 hash 中没有元素,则此函数将返回空列表:
my %hash = (&#8220;a&#8221;=>1, &#8220; b&#8221;=>2, &#8220; c&#8221;=>3);
my@k = keys %hash;

  my@v = values %hash;
  
  each 函数

  
  while (($key, $value) = each %hash){
print &#8220; $key => $value"n&#8221; ;

  }
  
  使用 exists 函数,如果hash 中存在此 key,则返回true,这和是否有对应的value 无关 .

  
  delete函数将某个给定的 key(包括其对应的value)从hash 中删除。(如果不存在这个key,则什么也不做;不会有警告或者错误信息。)

  
  正则表达式

  要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间.
  
  元字符与字符类型

  点(.)可以匹配任何除换行符之外的单字符。+,?,*可以放在一个字符后,也可以放在使用()进行分组之后的模式后。

  \d == [0-9]                \D非数字

  \w == [A-Za-z0-9]     \W非word字符

  \s == [\f\t\n\r ]          \S非空白字符
  
  if(/yes/i) {#i大小写无关
print &#8220; In that case, I recommend that you go bowling."n&#8221; ;

  }
  

  默认情况下,点(.)不匹配换行符,这对于&#8220; 单行中查找&#8221; 的问题能很好解决。如果你的字符串中有换行符,并希望点(.)能匹
配它们,那可以使用/s这个修饰符。它将模式中点(.)的行为变成同字符类["d"D]的行为类似:可以匹配任何字符,包括换
行符。
  
  if(/Barney.*Fred/s){
print &#8220;That string mentions Fred after Barney!"n&#8221;;
}

  
  
  /x修饰符,允许你在模式中加入任何数量的空白,以方便阅读:
/ -?"d+".?"d*/ #这是什么含义?

  / -? "d+ ".? "d* /x #要好些
  由于注释可以表示空白,因此,下面是一个包含注释的例子:
if (m{
barney #小个子小伙
.* #可以包含任何字符
fred #嗓门大的小伙
}six) { #修饰符包括包括/s, /i, /x
print &#8220; That string mentions Fred after Barney!"n&#8221; ;
}

  
  

  锚定与绑定

  ^与$分别为串头和串尾锚定,而\b为词锚定,如/\bcat\b/将match单词cat而非其他,而\B为非词锚定,如/\bcat\B/将匹配由cat开头的其他单词。=~为模式绑定。模式可以内插变量,如/^($var)/。

  
  匹配的变量保存 :$'$&$'

  $`中含有正则表达式引擎在匹配成功前所找到的变量,而$'为此模式还没有匹配的剩余部分。如果将这三个变量放在一起,你将得到原始字符串。
  

  精确匹配数字范围

  模式/a{5,15}/将匹配5 个到15个a 中的任意一个(包括 5,和15)。如果a出现了 3次,则次数太少,而不能匹配上;如果出现5 次,则匹配上了;如果出现 10次,仍然匹配上。如果出现 20次,仍将匹配上,前15个将匹配上。如果省略掉第二个数字(逗号留下),现在没有上限了。如果除了上限数字外,逗号也被省略了,那将匹配确定的次数。
  
  匹配的返回值

  s///会返回一个 Boolean值。如果成功替换则返回true;否则返回 false。
  

  s///分隔符改变:如果使用的是配对的字符,也就是说其左字符和右字符不的,则必需使用两对:一对存放模式,一对存放替换的字符串。如s{fred}{barney};
  
  关于替换串中的大小写

  有时,希望确保被替换的字符串均是大写的(或者不是,视情况而定)。这在 Perl 中只需使用某些修饰符就能办到。"U 要

  求紧接着的均是大写:
  $_ =&#8220; I saw Barney with Fred.&#8221; ;
  s/(fred|barney)/\U$1/gi; #$_现在是 &#8220; I saw BARNEY with FRED.&#8221;
  默认时,会影响到剩余的(替换的)字符串。可以使用"E来改变这种影响:

  s/("w+) with ("w+)/\U$2\E with $1/i; #$1现在是 &#8220; I saw FRED with barney.&#8221;
  也可以要求后面的均为小写:\L.
  
  使用小写形式时(\l和\u),只作用于下一个字符.
  
  split与 join

  split /pattern/, $var;

  默认时,split对$_操作,模式为空白:
my @fields = split; #同 split /"s+/, $_;

  join 函数类似于:
my $result = join $glue, @pieces;
  my $x = join&#8220; :&#8221; , 4, 6, 8, 10, 12; #$x 为 &#8220; 4:6:8:10:12&#8221;
  
  列表与匹配

  在列表 context 中使用模式匹配(m//)时,如果匹配成功返回值为内存变量值的列表;如果匹配失败则为空列表:
$_ =&#8220; Hello there, neighbor!&#8221; ;
my($first, $second, $third) =/(\S+) (\S+), (\S+)/;
print &#8220; $second is my $third"n&#8221;
  
  Hash与匹配

  如果有不止一对括号,每一次返回不止一个字符串。例如将字符串放入 hash 中,如下:
my $data = &#8220; Barney Rubble Fred FlintstoneWilma Flintstone&#8221; ;

  my %last_name = ($data =~ / (\w+)\S+(\w+)/g)
  
  贪婪与非贪婪

  perl的正则表达式引擎是贪婪的,因此.*将尽可能匹配多的字符。可以使用非贪婪的数量词 +?, *?。

  
  多行

  /m 这个正则表达式选项允许它们根据内部的换行符进行匹配(将m看作多行(think m for multiple lines))。这时锚定针对每一行,而非整个字符串。

  
  文件备份

  变量$^I:如果没有指定文件名,则其从标准输入流中自动打开和关闭一系列文件进行读入。但如
果$^I中有字符串,这个字符串则会成为备份文件的扩展名。
  
  非捕捉用的括号(non-capturing parentheses),对于它,有一个特殊的写法。我们在开括号后面加上一个问号和冒号,(?:)。
  
其他逻辑控制符  last == break in C
  next == continue in C

  redo 它会调到当前循环块的顶端,不进行条件表达式判断并接着本次循环。 next 和 redo 的最大区别在于,next 会进入下一次循环,而 redo 会继续执行本次循环。  

  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156594-1-1.html 上篇帖子: perl工具 下篇帖子: 标量变量——perl
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表