我必须解析一个文件并将其存储在一个表中。我被要求使用哈希来实现这一点。给我一些简单的方法,只在Perl。
-----------------------------------------------------------------------
L1234| Archana20 | 2010-02-12 17:41:01 -0700 (Mon, 19 Apr 2010) | 1 line
PD:21534 / lserve<->Progress good
------------------------------------------------------------------------
L1235 | Archana20 | 2010-04-12 12:54:41 -0700 (Fri, 16 Apr 2010) | 1 line
PD:21534 / Module<->Dir,requires completion
------------------------------------------------------------------------
L1236 | Archana20 | 2010-02-12 17:39:43 -0700 (Wed, 14 Apr 2010) | 1 line
PD:21534 / General Page problem fixed
------------------------------------------------------------------------
L1237 | Archana20 | 2010-03-13 07:29:53 -0700 (Tue, 13 Apr 2010) | 1 line
gTr:SLC-163 / immediate fix required
------------------------------------------------------------------------
L1238 | Archana20 | 2010-02-12 13:00:44 -0700 (Mon, 12 Apr 2010) | 1 line
PD:21534 / Loc Information Page
------------------------------------------------------------------------
我想阅读此文件,我想执行拆分或其他任何操作来提取表格中的以下字段:
L
开头的ID应该是表格中的第一个字段Archana20
必须位于第二个字段PD
必须位于第四个字段/
之前的内容必须位于最后一个字段中)我的问题是:
--------…
(分隔线)?|
,/
)?请提供一些简单的方法,以便我能够理解,因为我是Perl的初学者。
答案 0 :(得分:2)
我的问题是:
- 如何忽略此文件中的-------- ...(分隔线)?
- 如何提取以上内容?
- 如何拆分,因为文件有两个分隔符(|,/)?
- 如何使用哈希实现它以及需要什么呢?
醇>
perldoc -f next
。在这种情况下,您可以使用正则表达式或更简单的匹配,以确保只跳过适当的行。perldoc perldsc
,尽管它现在可能只会让你感到困惑。另外一件事,上面的数据看起来在第一行中有一个半重要的拼写错误。仅在该行中,第一个字段与其分隔符之间没有空格。其他任何地方都是'| ”。我之所以提到这一点,只是因为它对split
很重要。我几乎编辑了这个,但也许数据本身是不规则的,但我怀疑它。
我不知道你对Perl的初学者有多少,但如果你是一个全新的,你应该考虑一本书(在线教程差别很大,很多都非常过时)。一本相当不错的入门书可以在线免费获取:Beginning Perl。另一个不错的选择是Learning Perl和Intermediate Perl(它们真的在一起)。
答案 1 :(得分:1)
当你说This is not a homework...to mean this will be a start to assess me in perl
我认为你的意思是这可能是你在新工作或某事上的第一个任务,在这种情况下,如果我们只是给你答案,它实际上会在以后伤害你因为他们会假设你比Perl更了解Perl。
但是,我会指出你正确的方向。
一个。不要使用split
,请使用正则表达式。你可以通过谷歌搜索“perl regex”来了解它们
B.谷歌“perl hash”了解perl哈希值。第一个结果非常好。
现在回答你的问题:
答案 2 :(得分:1)
如果此文件是基于行的,那么您可以在while循环中逐行读取。然后跳过那些没有格式化的行。
之后,您可以使用其他答案中指示的正则表达式。我会用它来拆分它并得到一个数组并为记录构建一个列表哈希。之后(或之前)通过修剪空格等来清理每条记录。如果使用正则表达式,则使用捕获表达式以这种方式添加到列表中。由你决定。
哈希键是第一列,列表包含其他所有内容。如果您只是直接插入,您可以使用列表列表,而只是将所有内容放入其中。
哈希的密钥允许您查看特定记录以进行快速查找。但如果你不需要那个,那么数组就可以了。
答案 3 :(得分:-1)
你可以试试这个,
要点需要知道:
之后使用split函数填充数组的Hashes。
#!/usr/bin/perl
use strict;
use warning;
my $test_file = 'test.txt';
open(IN, '<' ,"$test_file") or die $!;
my (%seen, $id, $name, $timestamp, $PD, $type);
while(<IN>){
chomp;
my $line = $_;
if($line =~ m/^-/){ #removing '---' lines
# print "$line:hello\n";
}else{
if ($line =~ /\|/){
($id , $name, $timestamp) = split /\|/, $line, 4;
} else{
($PD, $type) = split /\//, $line , 3;
}
$seen{$id}= [$name, $timestamp, $PD, $type]; //use Hashes of array
}
}
for my $test(sort keys %seen){
my $test1 = $seen{$test};
print "$test:@{$test1}\n";
}
close(IN);