perl语言 请大神帮忙翻一下

s<^out/\d+/(\d+\.\d+\.\d+\.\d+)/(\d{5})/(\d+\.\d+\.\d+\.\d+)/(\d{5})/(\d{7,}\.[0-9]{6... s<^out/\d+/(\d+\.\d+\.\d+\.\d+)/(\d{5})/(\d+\.\d+\.\d+\.\d+)/(\d{5})/(\d{7,}\.[0-9]{6})$><$1 $2 $3 $4 $5> && ++$new && do { if (exists $h{$o}) { s/^(\S+\s+\S+)\s+(\S+\s+\S+)\s+/$2 $1 / if $h{$o} == 1; } else {die "hash did not exist"}; 1; }
or die "pattern match fails at line $. for <$_>"' < "${PREFIX}"filelist > "${PREFIX}"basic.subset || exit 1 # old format

这段,尤其是前三行的正则,是什么意思啊?
展开
 我来答
Sophie_Hello
2013-07-25 · 超过30用户采纳过TA的回答
知道答主
回答量:59
采纳率:0%
帮助的人:52.7万
展开全部
s<^out/\d+/(\d+\.\d+\.\d+\.\d+)/(\d{5})/(\d+\.\d+\.\d+\.\d+)/(\d{5})/(\d{7,}\.[0-9]{6})$><$1 $2 $3 $4 $5>;
这个是一个替换, <>在里面是分隔符就跟默认的"//"是一个道理,只不过这里需要匹配的字符中有"/" 所以分隔符没有使用默认的. 这一串其实你解读就是用来匹配并格式化如下这样格式的字符串的:
"out/11/1.1.1.2/12345/1.1.1.3/12345/123456790.123456";
^out表示out开头,"/"就匹配"/",\d+在这个例子中匹配11 (你可以把这里改一下,一个数字或者10个数字都是可以的,\d+就是一个或以上),  (\d+\.\d+\.\d+\.\d+)匹配1.1.1.2,\d{5} 表示严格匹配5个数字, 这里是12345,后面的同理,直到最后一个(\d{7,}\.[0-9]{6})$ 表示以指定的格式结尾,这个格式先匹配7个或者7个以上的数字,再紧接着是".",之后再是6个数字.([0-9]就是0到9中的任何一个都可以匹配,个数是6个.)
替换执行完的结果是: 
1.1.1.2 12345 1.1.1.3 12345 123456790.123456

 s/^(\S+\s+\S+)\s+(\S+\s+\S+)\s+/$2 $1 / 
 这个也是替换,\S表示非空白字符. \s表示空白字符,小写大写是反意("\n"除外) 
匹配完之后把第二个括号中匹配到的与第一个括号匹配到的进行顺序交换,不过这个不是整行匹配,规定了非空格开头但是没有规定什么结尾,比如下面的例子:
my $str = "aa bb cc dd   aasgega";
$str =~ s/^(\S+\s+\S+)\s+(\S+\s+\S+)\s+/$2 $1 /;
 print $str;
====〉结果: cc dd aa bb aasgega

my $str = "aa bb cc dd";
$str =~ s/^(\S+\s+\S+)\s+(\S+\s+\S+)\s+/$2 $1 /;
 print $str;
 ====〉结果: cc dd aa bb

有问题再问

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式