Chinaunix

标题: 【请教】新人请教 [打印本页]

作者: xiaozi0lei    时间: 2013-02-23 21:19
标题: 【请教】新人请教
请问如下代码是什么意思?

($prog) = ($0 =~ m|([^/]+)$|);
作者: Perlvim    时间: 2013-02-23 22:47
($prog) = ($0 =~ m|([^/]+)$|);

1. ($prog)  是一个列表的上下文,用于捕获后面正则匹配的字符串
2. $0 是上文正则捕获的第一个值
3. m| 。。| 是匹配的另外一种定界符表示法
4. ([^/]+)$ 是一个正则表达式,[..] 是字符集 [^/] 代表所有不等于 / 反斜杠的字符集。 ([^/]+) 是一个捕获结构,$ 是指直到字符串末尾。

这个代码可能是提取一个带路径的文件名的末尾文件名称。
作者: xiaozi0lei    时间: 2013-02-23 23:57
回复 2# Perlvim


   1. 就是说用后面的正则表达式([^/]+)$去匹配绑定操作符左侧的$0里面的内容,把匹配到的字符赋给$prog,明白了。   2. 这个正则表达式([^/]+)$的意思是匹配所有不是"/"的字符,一个一个匹配直到行尾,取最后一个匹配到的字符串赋给$prog,是吧?
   3. 另外请教一个问题,这个绑定操作符"=~"的作用就是把左侧变量里面的内容通过右侧的正则表达式匹配出来,然后存入一个变量么?


谢谢Perlvim,非常感谢!^_^

作者: Perlvim    时间: 2013-02-24 00:47
1,2你理解是对的,第三条,匹配符号  =~ 在标量环境中返回的是一个bool值,表示是否匹配,如果匹配,返回匹配的次数,后来增加了在列表上下文的返回结果,捕获的值的列表。
作者: xiaozi0lei    时间: 2013-02-24 12:22
回复 4# Perlvim


假设$0= "/123/hello",那么这个程序过程是不是应该是这样?
不知道我这样理解对不对:
  1. 如果是 "/123/hello" =~ m|([^/]+)$|,那么返回的就是匹配到的次数 2,因为左边是个标量。
  2. 如果是$0 =~ m|([^/]+)$|,那么返回的就是匹配到的值 hello,因为左边是个变量

我试验了一下,按照上面,两次返回的都是hello,是不是我哪里理解错了?

帮忙解释一下吧,Perlvim 非常感谢~

作者: Perlvim    时间: 2013-02-24 13:21
标量环境是说返回的是单个值的上下文环境

my $scalar = "/123/hello" =~ m|([^/]+)$|;
# $scalar = 1
在全局匹配情况下,返回匹配到的次数
my $scalar = "/123/hello" =~ m|([^/]+)$|g;
# 由于有结尾标志的锚定,符合条件的还是只有一个

列表环境是说返回的是多个值的情况
(my $list) = "/123/hello" =~ m|([^/]+)$|;
用括号包围的结构是一个列表结构,也就是列表上下文环境。

上下文环境是Perl语言独特的语法特性。别的语言没有,除了自然语言之外。
作者: xiaozi0lei    时间: 2013-02-24 16:23
回复 6# Perlvim


   哦,我想我明白了。就是说要返回的值取决于最左边被赋值的变量的类型。如果是标量环境的话,就是返回布尔值;如果是列表环境的话,就返回匹配到的值列表。我试了一下,的确是这样。只是全局匹配返回匹配的次数,我没成功,我的结果是只要是标量的环境,都是返回布尔值,我把$符号去掉了也是返回1。不知道为啥。
另外,关于$符号,我感觉是用来指定匹配方向的,如果没有$符号,就是从左边开始匹配,如果有$符号就是从右边开始匹配,不知道对不对。

很感谢你的解释,以后还要多多请教。


作者: Perlvim    时间: 2013-02-24 16:45
  1. #!perl

  2. use 5.014;

  3. my $zero = 'hello/world';
  4. my $match_times = $zero =~ s|([^/]+)||g;
  5. say $match_times;
  6. while ('hello/world' =~ m|[^/]+|g) {
  7.   say "match";
  8. }
复制代码
我试了一下,是我搞错了。
在匹配情况下,标量上下文返回的是布尔值。
在替换情况下,标量上下文会返回替换成功的次数。
全局匹配环境中,返回的是一个迭代函数。

$ 匹配字符串的结尾,也许Perl解释器内部,为了防止一些不必要的回溯,会在特定情况下,从后往前扫描,但通常情况下,正则表达式匹配,是从字符串的前面往后扫描。
作者: xiaozi0lei    时间: 2013-02-24 23:38
回复 8# Perlvim


   我用你写的代码,试了一下,再加上你的解释,理清楚了,明白怎么一回事了。非常感谢你,Perlvim
作者: 小猪Gina    时间: 2013-02-26 09:14
围观的人已经犯晕了。。。
作者: xiaozi0lei    时间: 2013-03-01 13:17
回复 10# 小猪Gina


   我一开始也是晕的,呵呵
作者: 小猪Gina    时间: 2013-03-04 10:08
回复 11# xiaozi0lei


    唉~
作者: 芙蓉女侠    时间: 2013-03-04 10:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小猪Gina    时间: 2013-03-04 10:59
回复 13# 芙蓉女侠


    额。。慢慢学,会了就不觉得难了~
作者: xiaozi0lei    时间: 2013-03-05 09:37
赞同楼上的观点,只要会了就不觉得难了,所有语言都一样,只要掌握的它的脾气,你就会熟悉它了,加油哇




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2