Chinaunix

标题: scalar 问题 百年一遇 [打印本页]

作者: wdl111    时间: 2009-11-12 16:09
标题: scalar 问题 百年一遇
#!/usr/bin/perl
$a="ES事业部/PA处/(ProductAssurance)QSMC研发工程部";
$b="ES事业部/PA处/(ProductAssurance)QSMC研发工程部";
$c=scalar(grep(/^$b$/,$a))

print $c


输出的值 竟然是 0   我要疯了  我现在的输出里  就会有 重复的 "ES事业部/PA处/(ProductAssurance)QSMC研发工程部"   怎么办啊



scalar(grep(/^$b$/,@newdata))>0  改成 >=  问题就更多了 该有的也没了


老大们帮我
作者: linuxty    时间: 2009-11-12 16:21
标题: 回复 #1 wdl111 的帖子
没看懂你干什么 ?
改为这个试试也
$c=scalar(grep(/^$\Qb\E$/,$a))

不知道是不是你想要的
作者: wdl111    时间: 2009-11-12 16:26
我要 通过  这个判断  是否 变量内 存在  相同的字段  一般相同的话  输出  都>0  但是这个却等于0



这样的话  程序就认为这句话 在 数组里不存在  就会去插入   明白了吗
作者: wdl111    时间: 2009-11-12 16:34
举个列子   

数组  a    数组  b      现在要把  数组b内的数据插入  数组a     但是 如果 a内 已经有了 就不插入



我用了 scalar(grep(/^$b$/,@a))>0    这个做判断条件  ,但是  问题 出来   


a  内  有 ES事业部/PA处/(ProductAssurance)QSMC研发工程部

b 内  也有  ES事业部/PA处/(ProductAssurance)QSMC研发工程部


但是  scalar(grep(/^$b$/,@a))  得出的值  为 0   这样  ES事业部/PA处/(ProductAssurance)QSMC研发工程部  就会被插入a



老大们 看到了  帮我想办法啊
作者: churchmice    时间: 2009-11-12 16:38
这关scalar啥事?
明显就是中文匹配的有问题,你既然这么写直接用eq比较不好吗?
作者: linuxty    时间: 2009-11-12 16:42
标题: 回复 #4 wdl111 的帖子
我给你的,你试试吧


不好意思  写错了

$c=scalar(grep(/^\Q$b\E$/,$a))

[ 本帖最后由 linuxty 于 2009-11-12 17:12 编辑 ]
作者: cobrawgl    时间: 2009-11-12 17:12
跟你说过,让你用 encode/decode ,你咋就不听话乜?


作者: ulmer    时间: 2009-11-12 17:15
原帖由 wdl111 于 2009-11-12 16:09 发表
#!/usr/bin/perl
$a="ES事业部/PA处/(ProductAssurance)QSMC研发工程部";
$b="ES事业部/PA处/(ProductAssurance)QSMC研发工程部";
$c=scalar(grep(/^$b$/,$a))

print $c


输出的值 竟然是 0   我要疯 ...


Hi,

your problem is  simple.
the pattern string contains "()" which used as pattern place holder in regex.
try this: using qr // operater to escape special char !!!
C:\>perl -e "$x='foo/bar(x)y';$y='foo/bar(x)y';$x=qr{$x};$z=scalar(grep $x, $y);print $z"
1

作者: linuxty    时间: 2009-11-12 17:18
标题: 回复 #7 cobrawgl 的帖子
觉得跟编码没关系吧
他这点应该是正则的时候 () 没有转义吧
作者: churchmice    时间: 2009-11-12 17:22
用eq就可以了
my $c = grep {$_ eq $a} ($b)
作者: cobrawgl    时间: 2009-11-12 17:22
原帖由 linuxty 于 2009-11-12 17:18 发表
觉得跟编码没关系吧
他这点应该是正则的时候 () 没有转义吧


的确啊, 加上 \Q \E 就好了
作者: ulmer    时间: 2009-11-12 17:24
原帖由 churchmice 于 2009-11-12 17:22 发表
用eq就可以了
my $c = grep {$_ eq $a} ($b)


of course!
but man must understand where is the problem!
作者: churchmice    时间: 2009-11-12 17:35
标题: 回复 #11 cobrawgl 的帖子
失误失误
一时忘记了这个
作者: linuxty    时间: 2009-11-12 17:36
标题: 回复 #12 ulmer 的帖子
hi!
对这个还有点疑问.
$b是直接就传递给了正则引擎,而不是替换过后在传递给引擎的.如果是替换后在传递的话 / 在此处将出先语法错误..

所以问问怎么把握这种替换的先后次序?
作者: churchmice    时间: 2009-11-12 17:40
标题: 回复 #14 linuxty 的帖子
替换后再传的吧
       quotemeta EXPR
       quotemeta
               Returns the value of EXPR with all non-"word" characters
               backslashed.  (That is, all characters not matching
               "/[A-Za-z_0-9]/" will be preceded by a backslash in the
               returned string, regardless of any locale settings.)  This is
               the internal function implementing the "\Q" escape in double-
               quoted strings.
作者: linuxty    时间: 2009-11-12 17:42
标题: 回复 #15 churchmice 的帖子
在没加 \Q \E的时候也

$c=scalar(grep(/^$b$/,$a))  这个替换出来就是
$c=scalar(grep(/^ES事业部/PA处/(ProductAssurance)QSMC研发工程部$/,$a))
作者: ulmer    时间: 2009-11-12 17:49
原帖由 linuxty 于 2009-11-12 17:36 发表
hi!
对这个还有点疑问.
$b是直接就传递给了正则引擎,而不是替换过后在传递给引擎的.如果是替换后在传递的话 / 在此处将出先语法错误..

所以问问怎么把握这种替换的先后次序?


the principl is to escape special char which used in regexp before you use it for pattern.
the quotemeta() is one of methods too.




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