Perl if 等号

发布于 2024-10-03 22:04:19 字数 295 浏览 5 评论 0 原文

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

$i=0;

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

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

    print OUTPUT $output;
    $i++;
}

I need to detect if the first character in a file is an equals sign (=) and display the line number. How should I write the if statement?

$i=0;

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

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

    print OUTPUT $output;
    $i++;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

时光匆匆的小流年 2024-10-10 22:04:19

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

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

另请参阅 perldoc -v '$.'

Idiomatic perl would use a regular expression (^ meaning beginning of line) plus one of the dreaded builtin variables which happens to mean "line in file":

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

See also perldoc -v '$.'

浮世清欢 2024-10-10 22:04:19

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

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

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

Use $findChar eq "=". In Perl:

  • == and != are numeric comparisons. They will convert both operands to a number.
  • eq and ne are string comparisons. They will convert both operands to a string.

Yes, this is confusing. Yes, I still write == when I mean eq ALL THE TIME. Yes, it takes me forever to spot my mistake too.

我的影子我的梦 2024-10-10 22:04:19
  1. 看来您没有使用 strict警告。使用它们,特别是因为您不了解 Perl,您可能还想将 诊断 添加到列表中必须使用的编译指示。

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

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

  4. 请注意,诸如 INPUT 之类的裸字文件句柄是包全局的。除了 DATA 文件句柄之外,您最好使用 词法filehandles 以正确限制文件句柄的范围。

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

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

#!/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 '=';
    }
}
  1. It looks like you are not using strict and warnings. Use them, especially since you do not know Perl, you might also want to add diagnostics to the list of must-use pragmas.

  2. You are keeping track of the input line number in a separate variable $i. Perl has various builtin variables documented in perlvar. Some of these, such as $. are very useful use them.

  3. You are using my($line) = $_; in the body of the while loop. Instead, avoid $_ and assign to $line directly as in while ( my $line = <$input> ).

  4. Note that bareword filehandles such as INPUT are package global. With the exception of the DATA filehandle, you are better off using lexical filehandles to properly limit the scope of your filehandles.

  5. In your posts, include sample data in the __DATA_ section so others can copy, paste and run your code without further work.

With these comments in mind, you can print all lines that do not start with = 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
=
+

However, I would be inclined to write:

while (my $line = <DATA> ) {
    # this will skip blank lines
    if ( my ($first_char) = $line =~ /^(.)/ ) {
        print "$.:$first_char\n" unless $first_char eq '=';
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文