【问题标题】:Perl: extracting certain values from matrix filePerl:从矩阵文件中提取某些值
【发布时间】:2016-09-09 05:27:09
【问题描述】:

给定一个像文本文件这样的矩阵,我想提取所有行(\t 是分隔符)在第 3 列 (pos 2) 中包含值 > 60 并且在第 6 列 (pos 5)并将输出发送到不同的文件。到目前为止,我得到了:

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

open(my $in, "file.txt")or die $!;
my $line = <$in>;
my $count;
while (<$in>) {
   chomp;
   my @element = split (/\t/,$_);
   if ($element[2] >= 60 && $element[5] > 80){
       $count++; 
   }
}
close $in;
print $count;

怎么了?谢谢。PS。我发现了类似的问题,但我的 Perl 水平低,无法解决问题。

【问题讨论】:

  • 不增加 $count,你可以只做一个 print "$_\n";将行打印到屏幕上。这样,您可以检查是否从 if 语句中获得了正确的行。如果在拆分时遇到问题而您没有获得许多元素,则可能需要使用另一个反斜杠来转义反斜杠。

标签: perl file matrix extract


【解决方案1】:
  1. 您忘记在 open 中添加读取模式 (&lt;)。
  2. 确保文件中的行确实是制表符分隔的。

下面对我来说很好。

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

open(my $in, "<", "file.txt") or die $!;

my $count;

while (<$in>) {
   chomp;
   my @element = split (/\t/,$_);
   if ($element[2] >= 60 && $element[5] > 80){
       $count++; 
   }
}

close $in;
print $count;

哪里是文件.txt

10  20  60  40  50  90  70  80
10  20  20  40  50  30  70  80
10  20  40  40  50  50  70  80
10  20  65  40  50  80  70  80
10  20  70  40  50  90  70  80
10  20  50  40  50  90  70  80

即文件的第一行和第五行满足if 条件。

【讨论】:

    【解决方案2】:

    我已经复制粘贴了您刚刚编写的代码,并且我已经替换了文本文件的内容,但仍然收到以下错误消息:

    Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 1.
    Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 2.
    Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 3.
    Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 4.
    Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 5.
    Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 6.
    Use of uninitialized value $count in print at C:\Perl64\Temp1\ex.pl line 18.
    

    对此有何看法?

    【讨论】:

    • 那么我认为文件中的行并不是真正的制表符分隔。
    【解决方案3】:

    我重新创建了文件,标签分隔并仍然给出:

    Use of uninitialized value $count in print at C:\Perl64\Temp1\ex.pl line 19.
    

    第 19 行是 print $count;

    【讨论】:

    • 这意味着 $count 没有增加。这意味着 if 条件没有成功。如果第 3 列和第 6 列的值分别不大于 60 和 80,则可能是这种情况。看到这个演示工作正常:ideone.com/evjXgj
    • 另外请不要一直添加/删除答案。您可以编辑您的问题以添加更多数据。
    • 确实,在重新创建的文件中,只有一个条件为真。谢谢。
    • 很抱歉;我的评论不在正确的位置,并且我不小心删除了其他内容(我已对此进行了补救)。感谢您的提示。会的!
    猜你喜欢
    • 2021-12-16
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多