字体:  

新手问:关于输入变量值用chomp与不用时的区别

ELM 发表于: 2006-12-03 15:51 来源: 榆树社区

我在看资料时,说输入的变量值最好用chomp一下要不后面会带个回车的,如

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