额外的HASH()引用添加到Perl哈希输出

时间:2017-02-13 22:28:46

标签: perl hash

我尝试使用Perl读取FORTRAN程序,并删除INCLUDE命令并将其替换为USE

这很有效,除非打印出存储现有USE语句的哈希的内容,否则我会得到一个额外的条目。

my @lines = ( );
my %uses = { };

foreach $f1line (<>) {
    $f1line =~ s/\r[\n]*//g;

    if ($f1line =~ /^\s*INCLUDE 'FILE1.CMN'/ ||
        $f1line =~ /^\s*INCLUDE 'FILE2.CMN'/ ||
        $f1line =~ /^\s*INCLUDE 'FILE3.CMN'/) {
            $f1line = "      USE My_Mod";
    }

    if ($f1line =~ /^\s*USE /) {
        $uses{$f1line} = 1;
    }

    push @lines, $f1line . $/;
}

$found = 0;

foreach $line (@lines) {
    if ($found == 0 && $line =~ /^\s*USE /) {
        foreach my $x (sort(keys(%uses))) {
            print $x . $/;                      # (1)
        }

        $found = 1;
    } elsif ($found == 1 && $line =~ /^\s*USE /) {
        next;
    } else {
        print $line;
    }
}

输出是这样的:

C     Include parameters here
      USE My_Mod
      USE MyOther_Mod
      USE EvenAnother_Mod
HASH(0x7f9dc3805ce8)

HASH(0x...)引用来自何处?我打印哈希内容的唯一地方是(1)。它几乎看起来像是迭代哈希的键是以某种方式包括哈希本身。

我怎样摆脱这个?

1 个答案:

答案 0 :(得分:5)

你真的不是一个大问题,这里最重要的是你无法看到你正在做的错误。

这就是为什么你应该总是strictwarnings

在您的代码中,您首先要注意:

my %uses = { };

应该是:

my %uses = ();

my %uses; #it's fine also

然后它会起作用。

在&#34;哈希&#34;中使用{}您可以创建hashref的上下文,但事实并非如此。

  

可以使用大括号创建对匿名哈希的引用:

    $hashref = {
        'Adam'  => 'Eve',
        'Clyde' => 'Bonnie',
    };

同样优秀的做法是在foreach循环中声明变量,如:

foreach my $line (@lines) {

在你的其余代码中。