我尝试使用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)
。它几乎看起来像是迭代哈希的键是以某种方式包括哈希本身。
我怎样摆脱这个?
答案 0 :(得分:5)
你真的不是一个大问题,这里最重要的是你无法看到你正在做的错误。
在您的代码中,您首先要注意:
my %uses = { };
应该是:
my %uses = ();
或
my %uses; #it's fine also
然后它会起作用。
在&#34;哈希&#34;中使用{}
您可以创建hashref的上下文,但事实并非如此。
可以使用大括号创建对匿名哈希的引用:
$hashref = { 'Adam' => 'Eve', 'Clyde' => 'Bonnie', };
同样优秀的做法是在foreach
循环中声明变量,如:
foreach my $line (@lines) {
在你的其余代码中。