首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl if equals sign

Perl if equals sign
EN

Stack Overflow用户
提问于 2010-11-20 01:31:19
回答 3查看 2.7K关注 0票数 1

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

代码语言:javascript
复制
$i=0;

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

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

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

回答 3

Stack Overflow用户

发布于 2010-11-20 01:35:09

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

代码语言:javascript
复制
while (<INPUT>) {
    print "$.\n" if /^=/;
}

另请参阅perldoc -v '$.'

票数 10
EN

Stack Overflow用户

发布于 2010-11-20 01:34:30

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

  • ==!=是数值比较。它们会将两个操作数都转换为number.
  • eq,而ne是字符串比较。它们会将两个操作数都转换为字符串。

是的,这很令人困惑。是的,我仍然在写==,我指的是eq 一直在写。是的,我也花了很长时间才发现我的错误。

票数 8
EN

Stack Overflow用户

发布于 2010-11-20 02:37:17

  1. 看起来您没有使用strictwarnings。使用它们,特别是因为您不了解Perl,您可能还希望将diagnostics添加到必须使用的编译指示列表中。
  2. 您将在一个单独的变量$i中跟踪输入行号。Perl在perlvar中记录了各种内置变量。其中一些是非常有用的,比如$.
  3. ,你在while循环的主体中使用了my($line) = $_;。取而代之的是,避免使用$_,而是像在while ( my $line = <$input> )中那样直接分配给$line
  4. 请注意,像INPUT这样的无字文件句柄是包全局的。除了DATA文件句柄之外,您最好使用lexical filehandles来适当地限制您的帖子的范围,在__DATA_部分包含示例数据,这样其他人就可以复制、粘贴和运行您的代码,而无需进一步的工作。

记住这些注释后,您可以使用以下命令打印所有不以=开头的行:

代码语言:javascript
复制
#!/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
=
+

然而,我倾向于这样写:

代码语言:javascript
复制
while (my $line = <DATA> ) {
    # this will skip blank lines
    if ( my ($first_char) = $line =~ /^(.)/ ) {
        print "$.:$first_char\n" unless $first_char eq '=';
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4227714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档