【发布时间】:2016-02-23 21:58:35
【问题描述】:
Perl 帮助
我有一个复杂的实用程序(我们简称为 KIP) 我正在从 AWK 转换为 perl。 AWK 有一个双重链接的设施 我使用的列表。这很好用,但我不知道该怎么做 这在 perl 中。我知道 FIFO 链表是一个很好的解决方案。
KIP 功能(如果您有兴趣) KIP 从文档中删除重复项。 AWK程序的方式 工作原理是它扫描文档以查找重复的项目和 构建一个显示“真实”项目及其所有重复项的数组。一世 需要一个 FIFO 链表到重复项,如下所示:
PICTORIAL OF THE FUNCTION
REAL
ITEM ARRAY OF $POINTER[] LINKED LIST
NUMBER
+-------------+---------+ +---------------+ +---------------+
1 | real item 1 | ------> | |dup_1_of_item_1|-->|dup_n_of_item_1|
+-------------+---------+ +---------------+ +---------------+
+-------------+---------+ +---------------+ +---------------+
2 | real item 2 | ------> | |dup_1_of_item_2|-->|dup_n_of_item_2|
+-------------+---------+ +---------------+ +---------------+
+-------------+---------+ +---------------+ +---------------+
3 | real item 3 | ------> | |dup_1_of_item_3|-->|dup_n_of_item_3|
+-------------+---------+ +---------------+ +---------------+
... ...
KIP 将运行“real item n”数组来处理每个真实项目。去做 因此,KIP 将运行链表链来删除重复项 从文档中。只是推送的副本会很好 将“真正的项目 1”放入堆栈并保存堆栈地址以供以后使用。然后, 之后,KIP 可以访问保存的堆栈地址并弹出项目。
我知道这是我对 perl 的了解不足,但我很难过 实现这样的指针数组结构。我认为推和流行 应该可以工作,但是语法错误或根本不起作用 我。
这就是我发现的困难 -
我需要创建可以将信息推送到其中的动态堆栈。
堆栈将在 KIP 的不同部分访问,所以我需要 将堆栈地址保存在数组中以供以后使用。
堆栈是动态构建的(不是使用 QW 构建的数组 所有文档似乎都有描述)。
我需要大量堆栈(每个 real_item 对应一个 重复)。
谁能给我指路?任何相关信息将 赞赏。
TIA
这是我所做的;
ADD ITEMS TO STACK
# $IDX_ori_iSub - subscript for the real item
# $IDX_dup_iSub - subscript for each duplicate item that is
# found
# populate the fields for the stack
$MsgID = $IDXMsgID[$IDX_dup_iSub];
$LineNumber = $IDXLineNumber[$IDX_dup_iSub];
$Offset = $IDXOffset[$IDX_dup_iSub];
$LineCount = $IDXLineCount[$IDX_dup_iSub];
$KCount = $IDXKCount[$IDX_dup_iSub];
# set up stack
my @stackOfDuplicates;
# Save the address of the stack for later access
if ( $IDXChain[$IDX_ori_iSub] == 0)
{
$IDXChain[$IDX_ori_iSub] = \@stackOfDuplicates;
}
# Push items onto list.
push @stackOfDuplicates, $MsgID ;
push @stackOfDuplicates, $LineNumber ;
push @stackOfDuplicates, $Offset ;
push @stackOfDuplicates, $LineCount ;
push @stackOfDuplicates, $KCount ;
从堆叠中移除物品
my @stackOfDuplicates = $IDXChain[$IDX_iSub];
if ( @stackOfDuplicates )
{
# Remove first items from list.
my $MsgID = shift @stackOfDuplicates;
my $LineNumber = shift @stackOfDuplicates;
my $Offset = shift @stackOfDuplicates;
my $LineCount = shift @stackOfDuplicates;
my $KCount = shift @stackOfDuplicates;
print " \$MsgID = $MsgID";
print " \$LineNumber = $LineNumber";
print " \$Offset = $Offset";
print " \$LineCount = $LineCount";
print " \$KCount = $KCount";
}
目前为止我看到的典型结果
$MsgID = ARRAY(0x2b786c0)
Use of uninitialized value $LineNumber in concatenation (.) or string
$LineNumber =
Use of uninitialized value $Offset in concatenation (.) or string at
$Offset =
Use of uninitialized value $LineCount in concatenation (.) or string
$LineCount =
Use of uninitialized value $KCount in concatenation (.) or string at
$KCount =
【问题讨论】:
-
总而言之,您正试图从文本文件中删除重复记录?
-
在 Perl 中,您使用散列(关联数组,其中的键是字符串)来处理这类事情,而不是数组(用整数索引)或链表。大多数时候,数组只是笨拙的。链表很有用,它们可以使用散列来构建,但我不会在这里使用它们。
-
始终以
use strict; use warnings;开始您的 Perl 脚本,以便获得正确的编译时错误报告。 -
查看我认为确定问题的更新帖子。
标签: perl stack singly-linked-list