Perl if 等号
我需要检测文件中的第一个字符是否是等号 (=
) 并显示行号。我应该如何编写if
语句?
$i=0;
while (<INPUT>) {
my($line) = $_;
chomp($line);
$findChar = substr $_, 0, 1;
if($findChar == "=")
$output = "$i\n";
print OUTPUT $output;
$i++;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
惯用的 Perl 会使用正则表达式(
^
表示行的开头)加上一个可怕的内置变量,它恰好表示“文件中的行”:另请参阅 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":See also perldoc -v '$.'
使用
$findChar eq "="
。在 Perl 中:==
和!=
是数字比较。他们会将两个操作数转换为数字。eq
和ne
是字符串比较。他们会将两个操作数转换为字符串。是的,这很令人困惑。是的,当我的意思是
eq
一直时,我仍然写==
。是的,我也花了很长时间才发现自己的错误。Use
$findChar eq "="
. In Perl:==
and!=
are numeric comparisons. They will convert both operands to a number.eq
andne
are string comparisons. They will convert both operands to a string.Yes, this is confusing. Yes, I still write
==
when I meaneq
ALL THE TIME. Yes, it takes me forever to spot my mistake too.看来您没有使用 strict 和 警告。使用它们,特别是因为您不了解 Perl,您可能还想将 诊断 添加到列表中必须使用的编译指示。
您将在单独的变量
$i
中跟踪输入行号。 Perl 在 perlvar 中记录了各种内置变量。其中一些,例如$.
使用它们非常有用。您在
while
循环体中使用my($line) = $_;
。相反,应避免$_
并直接分配给$line
,如while ( my $line = <$input> )
中所示。请注意,诸如
INPUT
之类的裸字文件句柄是包全局的。除了DATA
文件句柄之外,您最好使用 词法filehandles 以正确限制文件句柄的范围。在您的帖子中,在
__DATA_
部分中包含示例数据,以便其他人无需进一步工作即可复制、粘贴和运行您的代码。考虑到这些注释,您可以使用以下方式打印所有不以
=
开头的行:但是,我倾向于编写:
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.
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.You are using
my($line) = $_;
in the body of thewhile
loop. Instead, avoid$_
and assign to$line
directly as inwhile ( my $line = <$input> )
.Note that bareword filehandles such as
INPUT
are package global. With the exception of theDATA
filehandle, you are better off using lexical filehandles to properly limit the scope of your filehandles.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:However, I would be inclined to write: