-2
Bini  --  -21.89753  -20.47853  -20.27835  -18.34952  -16.23454

Bini  --  -16.89753  -14.47853  -13.27835  -12.34952  -11.23454

Bini  --  -10.09014  

我的文件有一个如上所示的数组。这个以 Bini 开头的数组是具有多行的数组,但我在这里只显示 3 行。我想尝试的是从最后 2 行中提取最后 3 个元素。所以,-12.34952 -11.23454 -10.09014 这三个元素是我想要的。有时,最后一行可能有 2 到 5 个元素,具体取决于文件。但在这里,它只有最后一行的 1 个元素。

我尝试如下

while(my $line = <FILE>) {
     if($line =~ /Bini/) {      #extract last 3, 2, 1 element
     my @entries = split(/Ws+/,$line);
     $element1 = (pop@entries);
     $element2 = (pop@entries);
     $element3 = (pop@entries);
     }

结果,我可以看到 element1 是 -10.09014,但不幸的是,我无法获得 element 2 和 element 3。有人可以帮我吗?..


我想保留我的原始脚本。我的意思是,result.txt的创建过程和输出格式“log”的打开方法。

块引用

#!/usr/bin/perl use warnings; 
use strict; 
use File::stat; 

open (OUT, ">", "result\.txt") or die "cannot open file\,\n"; #from this plx, I want to creat result.txt 

foreach my $answer (glob "*.log") { # format of reading file will be "log" 

open (FILE, "<", "$answer") or die "Cannot open file\.\n"; 
my @file = split ('\.', $answer);

块引用

您的文件引发错误的打开方法(我的@array = read_file('input.txt')我想知道如何使用从我的$line = 0 开始的脚本从您的脚本开始。即使我将txt 的格式更改为日志(例如input.log),它仍然给出错误消息。(read_file 'input.txt' - sysopen: No such file or directory at text.plx line 6)

......

4

2 回答 2

2

您可以从每一行中取出所有数字,将它们推到 的末尾@entries,并且始终只保留最后三个。

my @entries;
while(my $line = <FILE>) {
     next if $line !~ /Bini/;
     push @entries, grep /\d/, split /\s+/,$line;
     @entries = @entries[-3 .. -1] if @entries > 3;
}
print join "\n", @entries;

输出

-12.34952
-11.23454
-10.09014
于 2013-09-03T16:29:24.047 回答
0

••• 注意•••• 此处的输入文件特定于您最近的、被阻止的问题(使用perl,如何在每行有相同单词的情况下选择最后两行?(重新提问..))因此,仅适用于该输入。

这是您最近提供的输入:

Bini  --  -10.09014  

cidi

Bini  --  -21.89753  -21.47853  -20.27835  -20.34952  -17.23454

Bini  --  -16.89753  -12.47853  -11.27835  -11.34952  -10.23454

Bini  --  -09.09014  

light is 3.4

这将完全实现您想要的(即从倒数第二行中提取以“Bini”开头的最后两个元素,并从最后一行以“Bini”结尾的最后一个元素),但仅此而已...

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

my $file = 'location/of/your/file.txt';
open my $input, '<', $file or die "Can't write to $file: $!";

my $line = 0;
my (@element1, @element2, @element3);
while (<$input>){ 
    chomp;
    next if ($_ =~ /^\s*$/); # skips a line of input if the line is blank
        if ($_ =~ /^Bini/) { # if the line starts with Bini
            $line++; # Add 1 to count variable
            my @split = split('\s+'); # split by spaces
            if ($line == 3) { # if the line number = 3 (i.e. second to last)
                push @element1, $split[-1]; # add the last element of split (-10.234...) to @element1
                push @element2, $split[-2]; # # add the second-to-last element of split to @element2
            }
            elsif ($line == 4) { # if the line number is 4 (last line starting with Bini
                push @element3, $split[-1]; # # add the last element of split to @element1
            }
        }
}

print "$element3[0]\t$element1[0]\t$element2[0]\n";

输出:

-09.09014   -10.23454   -11.34952
于 2013-09-05T16:42:43.347 回答