我正在尝试使用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.
可以使用大括号创建对匿名哈希的引用:
Run Code Online (Sandbox Code Playgroud)$hashref = { 'Adam' => 'Eve', 'Clyde' => 'Bonnie', };
也是一个好的做法,在foreach循环中声明你的变量,如:
foreach my $line (@lines) {
Run Code Online (Sandbox Code Playgroud)
在其余的代码中.
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |