Perl如果等于符号

时间:2010-11-19 17:31:19

标签: perl equals-operator

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

$i=0;

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

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

    print OUTPUT $output;
    $i++;
}

3 个答案:

答案 0 :(得分:10)

惯用语perl将使用正则表达式(^表示行的开头)加上一个可怕的内置变量,这恰好意味着“文件中的行”:

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

另见perldoc -v '$.'

答案 1 :(得分:8)

使用$findChar eq "="。在Perl:

  • ==!=是数字比较。他们会将两个操作数转换为数字。
  • eqne是字符串比较。他们会将两个操作数转换为字符串。

是的,这很令人困惑。是的,当我的意思是== 所有时间时,我仍然会写eq。是的,我也需要永远发现我的错误。

答案 2 :(得分:1)

  1. 您好像没有使用strictwarnings。使用它们,特别是因为您不了解Perl,您可能还想将diagnostics添加到必须使用的pragma列表中。

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

  3. 您在my($line) = $_;循环的正文中使用了while。相反,请避免使用$_并直接分配到$line while ( my $line = <$input> )

  4. 请注意,INPUT之类的裸字文件句柄是包全局的。除DATA文件句柄外,最好使用lexical filehandles来正确限制文件句柄的范围。

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

  6. 考虑到这些注释,您可以使用以下代码打印所有不以=开头的行:

    #!/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 '=';
        }
    }