我需要检测文件中的第一个字符是否为等号 ( =
) 并显示行号。我应该如何写if
声明?
$i=0;
while (<INPUT>) {
my($line) = $_;
chomp($line);
$findChar = substr $_, 0, 1;
if($findChar == "=")
$output = "$i\n";
print OUTPUT $output;
$i++;
}
我需要检测文件中的第一个字符是否为等号 ( =
) 并显示行号。我应该如何写if
声明?
$i=0;
while (<INPUT>) {
my($line) = $_;
chomp($line);
$findChar = substr $_, 0, 1;
if($findChar == "=")
$output = "$i\n";
print OUTPUT $output;
$i++;
}
惯用的 perl 将使用正则表达式(^
表示行首)加上一个可怕的内置变量,它恰好表示“文件中的行”:
while (<INPUT>) {
print "$.\n" if /^=/;
}
使用$findChar eq "="
. 在 Perl 中:
==
并且!=
是数字比较。它们会将两个操作数都转换为数字。eq
并且ne
是字符串比较。它们会将两个操作数都转换为字符串。是的,这令人困惑。==
是的,当我的意思是eq
ALL THE TIME时,我仍然在写作。是的,我也需要很长时间才能发现我的错误。
看起来您没有使用strict和warnings。使用它们,特别是因为您不了解 Perl,您可能还想将诊断添加到必须使用的编译指示列表中。
您在单独的变量中跟踪输入行号$i
。Perl 在perlvar中记录了各种内置变量。其中一些,例如$.
非常有用的使用它们。
您正在循环my($line) = $_;
体内使用。while
相反,避免并直接$_
分配给.$line
while ( my $line = <$input> )
请注意,诸如INPUT
包全局之类的裸字文件句柄。除了DATA
文件句柄,最好使用词法文件句柄来适当地限制文件句柄的范围。
在您的帖子中,在该部分中包含示例数据,__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 '=';
}
}