learning perl读书笔记(二)

Chapter 6: hashes

  • 取值:$hash{$some_key}
  • list和hash可以互相转换 @any_array = %some_hash
  • key value互换:%new_hash = reverse %old_hash
  • hash key:@k = keys %hash hash value:@v = values %hash
  • $count = keys %hashscalar 类型的count里保存的是hash的数量
  • 遍历:
1
2
3
4
5
6
while (($key, $value) = each %hash){
print "$key => $value";
}
foreach $key (sort keys %hash){
$value = $hash{$key};
}

Chapter 7: Regular Expressions

1
2
3
4
5
6
7
8
9
while (<STDIN>){
chomp;
if (/PATTERN/){
print "match\n";
}
else{
print "not match\n";
}
}

Markdown

  • 回溯引用(back reference)

>
在正则表达式中,被括号()包围的字符串被称为一个组(capture group),回溯引用就是类似/1,/2等等,数字就代表组的序号。有了回溯引用之后就可以在后面方便地对匹配到出现过的字符串作再次匹配的操作。

比如正则y(.)(.)\2\1,匹配的串是yabba dabba doo,第一个group是a,第二个group是b,所以\2表示的就是第二个group的值b,\1表示的就是第一个group的值a,所以yabba符合这个正则表达式。
Perl 5.10提供了一种新的方式来表示回溯引用:\g{N},N表示的是组号。N也可以为负数,-1表示的就是最后一个组的组号。

Chapter 8: Matching with Regular Expressions

  • 正则匹配符是m//,也可以用别的符号来作限定,比如m(fred),m\,m{fred}
  • /i:忽略大小写 /s:将字符串视为单行来匹配 /x:忽略正则串中的空格
  • binding operator:=~
  • $1,\$,\$3可以来表示正则式内括号标示的参数
  • 在括号()内加入?:表示该括号只作为group标识,而不作为参数,序号编号可跳过
  • 指定变量的名字
    • (?<LABEL>PATTERN)中,LABEL就定义了该变量的名字
    • $+{LABEL}就可以调用该变量
1
$&是匹配到的内容,$`是匹配到内容左侧的内容,$'是匹配到内容右侧的内容

Chapter 9: Processing Text with Regular Expressions

  • 正则替换符是s/xxx/yyy/
  • /g会对全部的匹配进行替换
  • 使用新的分隔符:s{fred}{barney} s[fred](barney) s<fred>#barney#
  • \U变大写,\L变小写
  • \u,\l改变第一个字母的大小写
  • .*操作默认都是贪婪的,会匹配到符合的最后一个,在一些场景(比如说html标签的匹配,<b>(.*)</b>就会直接从第一个<b>直接匹配到所有文本的最后一个</b>)这显然不是我们想要的。出现这种情况的时候,加个上?就能够把模式改成非贪婪的,(.*?)这样子遇到第一个匹配的就会停止匹配了,下面是一些改变贪婪模式的写法
    Markdown