我开始在Perl中,并在while循环中逐行解析一些文本,但无法找到有关此特定问题的帮助.我想使用当前文本行中先前读取的文本行的信息.
我的代码如下:
while(<data>){
my $message = substr $_, 0, 1;
if ($message eq 'A'){
my $order_ref = substr $_, 1, 9;
my $order_book = substr $_, 20, 6;
push @add_orders, $_;
print add_order_file "$order_ref,$order_book\n";
}
if ($message eq 'X'){
my $order_ref = substr $_, 1, 9;
#now I would like to use order_ref to look up order_book from a previous line of text
# where the message is equal to A,
my $order_book = LOOKED UP VALUE FROM PREVIOUS TEXT;
push @add_orders, $_;
print add_order_file "$order_ref,$order_book\n";
}
}
Run Code Online (Sandbox Code Playgroud)
"A"消息总是在"X"消息之前,因此我确信如果我看到带有order_ref编号的X条目,我会向后滚动并找到相关的A消息,我可以在其中提取order_book变量.我意识到这将涉及某种类型的regexp,但我不知道如何使Perl仅搜索前一行.谢谢!
编辑:我应该更清楚这一点."A"消息位于"X"消息之前,但它们都可以具有不同的order_ref,因此数据如下所示:
A order_ref1, order_book1
A order_ref2,order_book2
A order_ref3,order_book1
X order_ref2
X order_ref1
Run Code Online (Sandbox Code Playgroud)
对于X订单,我想使用order_ref2和order_ref1查找order_book.
通过重新定义整个问题,需要一个新的答案.
您需要将order_ref存储在哈希中,以便以后查找.需要在while循环外声明此变量.
请注意,我更改了您的substr调用中的数字以匹配您的示例输入.如果您共享有关如何构造输入行的一些信息,则可能有更好的方法来提取不同的值.使用substr假定固定宽度类型的数据.
use strict;
use warnings;
my %order_book; # your lookup hash
my @add_orders;
while (<DATA>) {
chomp;
my $message = substr $_, 0, 1;
if ($message eq 'A' or $message eq 'X') {
my $order_ref = substr $_, 2, 10;
if ($message eq 'A') {
$order_book{$order_ref} = substr $_, 13;
}
push @add_orders, $_;
print "$order_ref,$order_book{$order_ref}\n";
}
}
__DATA__
A order_ref1,order_book1
A order_ref2,order_book2
A order_ref3,order_book1
X order_ref2
X order_ref1
X order_ref3
Run Code Online (Sandbox Code Playgroud)
输出:
order_ref1,order_book1
order_ref2,order_book2
order_ref3,order_book1
order_ref2,order_book2
order_ref1,order_book1
order_ref3,order_book1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |