CODE:
my $a = <stdin>;
print "$a"; #这时会带个回车;
chomp ($a);
print "$a"; #这时就没有回车;但现在有个问题如:CODE:
my $string = "perl";
nutil ( ( my $a = <stdin>) =~ /$string/) {
print "wrong\n";
}# 其中在上面nutil ( ( my $a = <stdin>) =~ $string) 就不能加chomp,如改成nutil ( chomp( my $a = <stdin>) =~ $string) ,我个人认为应该去掉后面的回车再去比较啊,但是为什么,加了chomp就不行,不加的话就能正常比较啊。extmail回复:
下面是引用bjhb于2006-04-06 15:48发表的新手问:关于输入变量值用chomp与不用时的区别:
我在看资料时,说输入的变量值最好用chomp一下要不后面会带个回车的,如
my $a = <stdin>;
print "$a"; #这时会带个回车;
chomp ($a);
.......
chomp( my $a = <stdin>) =~ $string
注意看这个表达式, 根据左右结合及优先级(详细的要看perl手册及相关书籍、语法了)。
perl会先执行:
chomp( my $a = <stdin>)
如果$a读到了数据,那么chomp执行返回1(代表操作成功),因此这个表达式最终结果就是1,
表达式变为:
1 =~ $string
自然这个表达式不是你所要的。所以如果要chomp,必须先执行chomp,然后在将chomp之后的
$a与$string进行匹配才行。
新问题:
my $string ="i like perl . \n and you? \n";
if ( $string =~ m/like.*and/) {
print "ok\n";
}
这样的话也应该是模糊查询啊,那应该输出ok才对啊,可是不输出啊,非要加上s参数时才可以,那这不成了精确匹配了。
m// 是用来进行模式匹配的,就是在字符串中搜索特征串。
$a eq $b 是字符串比较
$string =~ m/like.*and/
这个操作在 $string 里面寻找 /like.*and/ 这个模式
在正则表达式中, (.)字符匹配任何单个字符除了换行符号 \n
所以你那个模式不匹配字符串:"i like perl . \n and you? \n";(去掉 \n 才能匹配)
/s 参数的作用就是为了让 (.) 能匹配 \n
转自: http://www.extmail.org/forum/read.php?tid=1384&fpage=2