有人能指出我在这个Perl程序中犯了什么错误吗?

3
根据以下代码,如果我在运行时输入“bibhu”,应该打印出bibhu一次,并且j应该为1。但是这并没有发生。为什么我得到了j=0
print "enter\n";
$find=<STDIN>;
$j=0;
@lines=qw(bibhu prasanna behera kuni shun jbjdkj);    
foreach (@lines) {
    if ($_ =~ /$find/) {
        print "$_\n";
        $j=$j+1;
    }
}
print "$j\n";

如果您的数组包含 foobibhubar,您会期望得到什么结果?您当前的程序将返回一个匹配。 - fugu
4个回答

7

您需要从输入中去掉换行符,只需调用chomp函数:

chomp($find = <STDIN>);

如果没有这个,如果你在提示符中输入"bibhu",$find将等于"bibhu\n"


1

这是你的脚本稍微改进后的版本 - 正如Lucas T.所写,你需要使用chomp删除输入字符串末尾的换行符:

#!/usr/bin/perl -w

use strict;

print "enter\n";
chomp(my $find=(<STDIN>));
my $j=0;
my @lines=qw(bibhu prasanna behera kuni shun jbjdkj);    
foreach (@lines) {
    if (/$find/o) {
        print "$_\n";
        $j=$j+1;
    }
}
print "$j\n";

请避免在命令行或shebang中使用-w。更推荐使用use warnings,而且最理想的是use warnings 'all'。我个人喜欢use warnings qw/ all FATAL /,如果出现任何警告,它也会终止程序。 - Borodin

0
我在考虑另一种方式:你可以在if语句中的$_后添加一个\n
...
if ("$_\n" =~ /$find/) {
...

0

原因是您的输入包含换行符。因此,您应该从输入中删除换行符或在正则表达式中允许换行符。

要从输入中删除换行符,请使用如其他答案所述的chomp

另一种方法是您应该使用x flag标志来允许正则表达式中的空格或换行符。

print "enter\n";
$find=<STDIN>;
$j=0;
@lines=qw(bibhu prasanna behera kuni shun jbjdkj);    
foreach (@lines) {
    if ($_ =~ /$find/x) {
    print "$_\n";
    $j=$j+1;
    }
}
print "$j\n";

但最好使用chomp函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接