1

我需要检测文件中的第一个字符是否为等号 ( =) 并显示行号。我应该如何写if声明?

$i=0;

while (<INPUT>)  {
    my($line) = $_;
    chomp($line);
    $findChar = substr $_, 0, 1;    

    if($findChar == "=")
    $output = "$i\n";

    print OUTPUT $output;
    $i++;
}
4

3 回答 3

10

惯用的 perl 将使用正则表达式(^表示行首)加上一个可怕的内置变量,它恰好表示“文件中的行”:

while (<INPUT>) {
    print "$.\n" if /^=/;
}

另见perldoc -v '$.'

于 2010-11-19T17:35:08.503 回答
8

使用$findChar eq "=". 在 Perl 中:

  • ==并且!=是数字比较。它们会将两个操作数都转换为数字。
  • eq并且ne是字符串比较。它们会将两个操作数都转换为字符串。

是的,这令人困惑。==是的,当我的意思是eq ALL THE TIME时,我仍然在写作。是的,我也需要很长时间才能发现我的错误。

于 2010-11-19T17:34:30.017 回答
1
  1. 看起来您没有使用strictwarnings。使用它们,特别是因为您不了解 Perl,您可能还想将诊断添加到必须使用的编译指示列表中。

  2. 您在单独的变量中跟踪输入行号$i。Perl 在perlvar中记录了各种内置变量。其中一些,例如$.非常有用的使用它们。

  3. 您正在循环my($line) = $_;体内使用。while相反,避免并直接$_分配给.$linewhile ( my $line = <$input> )

  4. 请注意,诸如INPUT包全局之类的裸字文件句柄。除了DATA文件句柄,最好使用词法文件句柄来适当地限制文件句柄的范围。

  5. 在您的帖子中,在该部分中包含示例数据,__DATA_以便其他人无需进一步工作即可复制、粘贴和运行您的代码。

考虑到这些注释,您可以打印所有不以=using 开头的行:

#!/usr/bin/perl

use strict; use warnings;

while (my $line = <DATA> ) {
    my $first_char = substr $line, 0, 1;
    if ( $first_char ne '=' ) {
        print "$.:$first_char\n";
    }
}
__DATA__
=
=
a
=
+

但是,我倾向于写:

while (my $line = <DATA> ) {
    # this will skip blank lines
    if ( my ($first_char) = $line =~ /^(.)/ ) {
        print "$.:$first_char\n" unless $first_char eq '=';
    }
}
于 2010-11-19T18:37:17.137 回答