为什么perl警告我打开我的$ fh,$ file缺少括号?

时间:2011-04-08 14:51:59

标签: perl warnings suppress-warnings

这是我的第一天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;

6 个答案:

答案 0 :(得分:31)

答案 1 :(得分:16)

my用于声明变量或列表。写入

是Perl的一个常见错误
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的解释。