Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Perl,读取文本文件,保存列以便使用列元素打开其他文件_Arrays_Perl_Extract - Fatal编程技术网

Arrays Perl,读取文本文件,保存列以便使用列元素打开其他文件

Arrays Perl,读取文本文件,保存列以便使用列元素打开其他文件,arrays,perl,extract,Arrays,Perl,Extract,我有一个文本文件,标签分开,如下所示:

我有一个文本文件,标签分开,如下所示:

<这是一个标题

col1 col2 col3
blablabla text1.txt blablabla
blablabla text2.txt blablabla
blablablatext3.txt blablabla

我希望能够提取某些元素(列),在本例中,仅提取单词text1.txt、text2.txt和text3.txt。我想稍后使用它们打开具有这些名称的文件。 到目前为止,我有以下代码:

#!/usr/bin/perl
use strict;
use warnings;

my @fields;
my ($column1, $column2, $column3);

my $text = "text.txt";

open(FILE, $text) or die "Could not read from $text, program halting.";

my @files;

while(<FILE>)
{
  chomp;
   /^</ and next;
   /^\s*$/ and next;
   /line*/ and next;

  ($column1, $column2, $column3) = split('\s', $_);

#PRINT ONE
#print $column2, "\t";


}
#PRINT TWO
print $column2, "\t";

close FILE;
#/usr/bin/perl
严格使用;
使用警告;
我的@fields;
我的($column1,$column2,$column3);
my$text=“text.txt”;
打开(文件,$text)或死亡“无法读取$text,程序停止。”;
我的@文件;
while()
{
咀嚼;

/^ 发生这种情况的原因是,您在循环的每个过程中都会覆盖
$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";
}
…在输出文件中。您必须确定如何筛选第一行

您还可以将输出保存到循环中的一个数组中,然后在以后处理它:

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";
}
使用警告;
严格使用;
我的$input_文件='data.txt';

打开我的$fh,'每次通过循环,你都会得到该行列的新编号,覆盖上一行的编号(在
$columnN
变量中)。保存它们:
push@col2,$column2;
(而不是注释输出);在循环之前声明数组。在循环之后打印的值只是最后一个数字。非常感谢。它成功了。谢谢大家,现在已经解决了,但是为什么第一次打印-循环中的一次给了我这个输出:“text1.txt text2.txt text3.txt”?这里没有覆盖?@Megiddo,因为在循环中,你在下一次迭代覆盖它之前打印。它不应该是第一次text1.txt,第二次迭代改为text2.txt,最后是最终版本text3.txt吗?很抱歉,这样一个noob,但它真的让我困惑。是的,当你在但是,在循环之后,由于您已将
$column2
声明为全局变量,因此在文件上循环时,您会不断重新填充该特定变量,并且在循环之后,该变量将包含在循环的最后一次迭代中成功接收到的值(
text3.txt
)也就是说,
$column2
变量在每个循环上都会被覆盖,并且在循环结束后,它会保存该迭代的值。由于上一次迭代将
$column2
设置为
text3.txt
,这就是循环结束后的值考虑:(1)
split/\s/
实际上相当于
split'
(除了
'
'也修剪空格)和
'
也是默认值。因此,在这两种用法中都可以说
split;
这里,在使用
split
时添加一条注释(或者在代码中使用它并给出解释),特别是因为
chomp
和regex使用默认值(3)在代码中添加了一条注释来标识头;下面的语句可以忽略——即使OP通过他们(错误的)
/line*/
知道这一点。
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";
}