在perl中管理哈希数组中的文件柄。

问题描述 投票:0回答:1

我有一个哈希数组,我用下面的方式填充。

# Array of hashes, for the files, regexps and more.
my @AoH;
push @AoH, { root => "msgFile", file => my $msgFile, filefh => my $msgFilefh, cleanregexp => s/.+Msg:/Msg:/g, storeregexp => '^Msg:' };

这是其中一个条目,我有更多这样的条目。并一直使用哈希中的每个键值对来创建文件,清理文本文件中的行等等。事情是这样的,我已经用下面的方式创建了文件。

# Creating folder for containing module files.
my $modulesdir = "$dir/temp";

# Creating and opening files by module.
for my $i ( 0 .. $#AoH )
{
    # Generating the name of the file, and storing it in hash.
    $AoH[$i]{file} = "$modulesdir/$AoH[$i]{root}.csv";
    # Creating and opening the current file.
    open ($AoH[$i]{filefh}, ">", $AoH[$i]{file}) or die "Unable to open file $AoH[$i]{file}\n";
    print "$AoH[$i]{filefh} created\n";
}

但后来,当我试图打印一行到 filedescriptor时,我得到了以下错误。

String found where operator expected at ExecTasks.pl line 222, near ""$AoH[$i]{filefh}" "$row\n""
        (Missing operator before  "$row\n"?)
syntax error at ExecTasks.pl line 222, near ""$AoH[$i]{filefh}" "$row\n""
Execution of ExecTasks.pl aborted due to compilation errors.

而且,这是我试图打印到文件的方式。

# Opening each of the files.
foreach my $file(@files)
{
    # Opening actual file.
    open(my $fh, $file);

    # Iterating through lines of file.
    while (my $row = <$fh>)
    {
        # Removing any new line.
        chomp $row;

        # Iterating through the array of hashes for module info.
        for my $i ( 0 .. $#AoH )
        {
            if ($row =~ m/$AoH[$i]{storeregexp}/)
            {
                print $AoH[$i]{filefh} "$row\n";
            }
        }
    }

    close($fh);
}

我打印文件的方式有什么问题?我试着打印filehandle的值,我能够打印出来。另外,我还用storeregexp打印了匹配,成功了。

顺便说一下,我是在Windows下使用perl 5.14.2的机器上工作的。

arrays perl hash
1个回答
8
投票

Perl的 print 期待一个非常简单的表达式作为文件柄--根据 文件:

如果你在数组或哈希中存储句柄,或者一般来说,只要你使用任何比裸词句柄或普通的无标量变量更复杂的表达式来检索它,你将不得不使用一个返回filehandle值的块来代替,在这种情况下,LIST可能不会被省略。

在你的例子中,你可以使用:

print { $AoH[$i]{filefh} } "$row\n";

你也可以使用方法调用的形式,但我可能不会。

$AoH[$i]{filefh}->print("$row\n");
© www.soinside.com 2019 - 2024. All rights reserved.