Chinaunix

标题: 一个perl的匹配,搞了半天,没搞定。。 [打印本页]

作者: john.daker    时间: 2008-11-26 20:01
标题: 一个perl的匹配,搞了半天,没搞定。。
$a="/";
$b="/a";
$c="/a/";
$d="/a/b";
$e="/a/b/";
$f="/a/b/c";
....

有这些格式的字符串,
像$a,$b就返回空
其他的就发挥a(第一个/和第二个/之间的)
有简洁的语句能做到吗?
作者: MMMIX    时间: 2008-11-26 20:48
按 / 分割,然后在 field 的个数 >= 2 的时候返回第一个 field 的值
作者: PurpleYUE    时间: 2008-11-26 20:49
发挥?返回?
作者: ly5066113    时间: 2008-11-26 20:56
print $1 if m{/(.+?)/};
作者: MMMIX    时间: 2008-11-27 09:46
原帖由 ly5066113 于 2008-11-26 20:56 发表
print $1 if m{/(.+?)/};

sweet
作者: hitsubunnu    时间: 2008-11-27 10:13

  1. (split(/\//,$str))[2]
复制代码

作者: mybook12345    时间: 2008-11-27 15:47
比较笨的办法 高手的不是太理解


use strict;
use warnings;

my $a=<STDIN>;

if($a=~m/\/.+\//g)
{
        my $b=(split(/\//,$a))[1];
        print $b;
}
作者: ulmer    时间: 2008-11-27 17:43
原帖由 john.daker 于 2008-11-26 20:01 发表
$a="/";
$b="/a";
$c="/a/";
$d="/a/b";
$e="/a/b/";
$f="/a/b/c";
....

有这些格式的字符串,
像$a,$b就返回空
其他的就发挥a(第一个/和第二个/之间的)
有简洁的语句能做到吗?

# simple + easy for reading:
@temp = split "/",  $yourTestString;
print ($#temp > 1) ? $temp[1] : "";
作者: ynchnluiti    时间: 2008-11-27 17:54
原帖由 ulmer 于 2008-11-27 17:43 发表

# simple + easy for reading:
@temp = split "/",  $yourTestString;
print ($#temp > 1) ? $temp[1] : "";

print +($#temp > 1) ? $temp[1] : "";
作者: MMMIX    时间: 2008-11-27 23:15
原帖由 ynchnluiti 于 2008-11-27 17:54 发表

print +($#temp > 1) ? $temp[1] : "";

我更倾向于
  1. print(($#temp > 1) ? $temp[1] : "");
复制代码
这种写法
作者: flw    时间: 2008-11-27 23:50
原帖由 MMMIX 于 2008-11-27 23:15 发表

我更倾向于  print(($#temp > 1) ? $temp[1] : ""; 这种写法

我更倾向于
my $msg = blablabla;
print $msg;

这种写法。

我觉得一行里面最好只有一个动作,那样会比较好。
虽然 FP 里面经常串起来很长的一句。



[ 本帖最后由 flw 于 2008-11-27 23:53 编辑 ]
作者: MMMIX    时间: 2008-11-28 09:38
原帖由 flw 于 2008-11-27 23:50 发表

我更倾向于
my $msg = blablabla;
print $msg;

这种写法。

我觉得一行里面最好只有一个动作,那样会比较好。
虽然 FP 里面经常串起来很长的一句。

如果代码量很大的话,动作过于分散会造成代码过长,反而影响阅读和理解。因此我觉得多个动作还是应该适当的压缩下。




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