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
#!perl
use 5.014;
my $zero = 'hello/world';
my $match_times = $zero =~ s|([^/]+)||g;
say $match_times;
while ('hello/world' =~ m|[^/]+|g) {
say "match";
}
复制代码
我试了一下,是我搞错了。
在匹配情况下,标量上下文返回的是布尔值。
在替换情况下,标量上下文会返回替换成功的次数。
全局匹配环境中,返回的是一个迭代函数。
$ 匹配字符串的结尾,也许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