这是我的第一天perl,我发现这个警告非常混乱。
在./grep.pl第10行的“my”列表周围缺少括号。
似乎
open FILE, $file;
工作正常。
有什么问题
open my $fh, $file;
谢谢!
#!/usr/bin/perl
use strict;
use warnings;
sub grep_all {
my $pattern = shift;
while (my $file = shift) {
open my $fh, $file;
while (my $line = <$fh>) {
if ($line =~ m/$pattern/) {
print $line;
}
}
}
}
grep_all @ARGV;
答案 0 :(得分:31)
答案 1 :(得分:16)
my
用于声明变量或列表。写入
my $var1, $var2, $var3;
宣布所有这些。警告应建议您使用正确的表格:
my ($var1, $var2, $var3);
在你的例子中,代码完全符合你的要求(你没有得到任何错误或错误的结果,是吗?),但要明确表示你可以编写
open my ($fh), $file;
虽然可以说将my
放在行中间就像隐藏它一样。也许更具可读性:
my $fh;
open $fh, $file;
答案 2 :(得分:2)
要获得有关警告消息的更详细说明,请使用perldoc diagnostics。 例如,
use strict;
use warnings;
use diagnostics;
my $fh, $file;
将产生以下有用的解释:
“我的”列表周围缺少括号 (W括号)你说过像
这样的东西my $foo, $bar = @_; when you meant my ($foo, $bar) = @_; Remember that "my", "our", and "local" bind tighter than comma.
您还可以在命令提示符下查看my的文档:
perldoc -f my
如果列出了多个值,则表示 列表必须放在括号中。
答案 3 :(得分:1)
真正的问题是省略函数调用是相当脆弱的。如果你这样做,可能会出现奇怪的错误。
$ perl -we'$file="abc"; open(my $fh, $file);'
$ perl -we'$file="abc"; open my $fh, $file;'
Parentheses missing around "my" list at -e line 1.
答案 4 :(得分:1)
在我看来,你的代码比你需要的时间长 - 你应该使用更多的懒惰。
#!/usr/bin/env perl
my $pattern = shift;
while (<>)
{
print if m/$pattern/;
}
如果您确定需要行号或文件名(可能是有多个文件)或其他更复杂的打印,那么您可能想要写出来。但我相信我展示的代码等同于你展示的代码。
通常,我会在代码中添加use strict;
和use warnings;
。但是,在这个例子中,唯一命名的变量是用my
定义的(所以严格不会有帮助),并且它没有任何警告。但是,如果您正在学习Perl,或者程序比这复杂得多,即使使用Perl大约20年后,我也会添加use
行。
答案 5 :(得分:0)
您可能在做学校或学习项目。但是当我想做这样的事情时,我会使用这个更简洁的程序版本。
perl -ne'打印if / your_regex /'your_file_list
有关详细信息,请尝试
perldoc perlrun
并查找-n和-p的解释。