我有一个文本文件,标签分隔,如下:
<这是一个标题
col1 col2 col3
blablabla text1.txt blablabla
blablabla text2.txt blablabla
blablabla text3.txt blablabla
我希望能够提取某些元素(列),在这种情况下只提取text1.txt,text2.txt和text3.txt。我想稍后使用它们打开带有这些名称的文件。 到目前为止,我有代码:
Picasso
如果我按照#PRINT ONE的说法进行打印,我会得到正确的版本作为输出,包含所有三个元素但是当我尝试将其保存在另一个变量中或将其写入文件时,只有" text3.txt"遗迹。 如果我在#PRINT TWO中进行打印,我只得到一个元素,相同的text3.txt。 我该如何从中吸取教训?我已尝试过这个网站上的大量代码但到目前为止还没有结果。谢谢。
答案 0 :(得分:2)
这种情况正在发生,因为你在循环的每次传递中覆盖$column2
,然后在你离开循环后,你得到了最后的结果(text3.txt
)。
您可以写入循环中的文件,此示例显示了该文件。它还显示了如何使用正确的3-arg open
和词法文件句柄:
use warnings;
use strict;
my $input_file = 'data.txt';
my $output_file = 'out.txt';
open my $fh, '<', $input_file or die $!;
open my $wfh, '>', $output_file or die $!;
while (<$fh>){
chomp;
next if /^\</;
next if /^\s*$/;
my ($c1, $c2, $c3) = split /\s/, $_;
print $wfh "$c2\n";
}
将此作为输入文件:
< this is a header
col1 col2 col3
blablabla text1.txt blablabla
blablabla text2.txt blablabla
blablabla text3.txt blablabla
产地:
col2
text1.txt
text2.txt
text3.txt
...在输出文件中。您必须弄清楚如何过滤第一行。
您还可以将输出保存到循环内的数组中,然后再对其进行处理:
use warnings;
use strict;
my $input_file = 'data.txt';
open my $fh, '<', $input_file or die $!;
my @saved_entries;
while (<$fh>){
chomp;
next if /^\</;
next if /^\s*$/;
push @saved_entries, (split /\s/, $_)[1];
}
for (@saved_entries){
print "$_\n";
}
...然后您可以将其写入文件或执行您需要的操作。
请注意,我在这里过于冗长,尽可能接近OP代码。