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