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

Jam*_*nen 0 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

C     Include parameters here
      USE My_Mod
      USE MyOther_Mod
      USE EvenAnother_Mod
HASH(0x7f9dc3805ce8)
Run Code Online (Sandbox Code Playgroud)

HASH(0x...)参考来自哪里?我正在打印哈希内容的唯一地方是在线(1).它几乎看起来像是迭代哈希的键是以某种方式包括哈希本身.

我怎么能摆脱这个?

小智 5

你并没有真正遇到大问题,重要的是你无法看到你正在做的错误.

这就是为什么你应该总是严格警告

在您的代码中,您可以从:

my %uses = { };
Run Code Online (Sandbox Code Playgroud)

它应该是:

my %uses = ();
Run Code Online (Sandbox Code Playgroud)

要么

my %uses; #it's fine also
Run Code Online (Sandbox Code Playgroud)

然后它会起作用.

通过{}在"哈希"上下文中使用,您可以创建一个不是这种情况的hashref.

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

    $hashref = {
        'Adam'  => 'Eve',
        'Clyde' => 'Bonnie',
    };
Run Code Online (Sandbox Code Playgroud)

也是一个好的做法,在foreach循环中声明你的变量,如:

foreach my $line (@lines) {
Run Code Online (Sandbox Code Playgroud)

在其余的代码中.