免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2604 | 回复: 14
打印 上一主题 下一主题

【请教】新人请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-23 21:19 |只看该作者 |倒序浏览
请问如下代码是什么意思?

($prog) = ($0 =~ m|([^/]+)$|);

论坛徽章:
0
2 [报告]
发表于 2013-02-23 22:47 |只看该作者
($prog) = ($0 =~ m|([^/]+)$|);

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

这个代码可能是提取一个带路径的文件名的末尾文件名称。

论坛徽章:
0
3 [报告]
发表于 2013-02-23 23:57 |只看该作者
回复 2# Perlvim


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


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

论坛徽章:
0
4 [报告]
发表于 2013-02-24 00:47 |只看该作者
1,2你理解是对的,第三条,匹配符号  =~ 在标量环境中返回的是一个bool值,表示是否匹配,如果匹配,返回匹配的次数,后来增加了在列表上下文的返回结果,捕获的值的列表。

论坛徽章:
0
5 [报告]
发表于 2013-02-24 12:22 |只看该作者
回复 4# Perlvim


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

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

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

论坛徽章:
0
6 [报告]
发表于 2013-02-24 13:21 |只看该作者
标量环境是说返回的是单个值的上下文环境

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

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

上下文环境是Perl语言独特的语法特性。别的语言没有,除了自然语言之外。

论坛徽章:
0
7 [报告]
发表于 2013-02-24 16:23 |只看该作者
回复 6# Perlvim


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

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

论坛徽章:
0
8 [报告]
发表于 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解释器内部,为了防止一些不必要的回溯,会在特定情况下,从后往前扫描,但通常情况下,正则表达式匹配,是从字符串的前面往后扫描。

论坛徽章:
0
9 [报告]
发表于 2013-02-24 23:38 |只看该作者
回复 8# Perlvim


   我用你写的代码,试了一下,再加上你的解释,理清楚了,明白怎么一回事了。非常感谢你,Perlvim

论坛徽章:
0
10 [报告]
发表于 2013-02-26 09:14 |只看该作者
围观的人已经犯晕了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP