-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 この 3 つの要素が必要でした。ファイルによっては、最後の行に 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);
     }

その結果、-10.09014 である element1 が表示されましたが、残念ながら要素 2 と要素 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);

引用符

ファイルを開く方法がエラーを誘発しました( my @array = read_file('input.txt') スクリプトから my $line = 0 から始まるスクリプトを使用するにはどうすればよいのでしょうか。txtの形式をログに変更しましたが(例input.log)、それでもエラー メッセージが表示されました (read_file 'input.txt' - sysopen: No such file or directory at text.plx line 6)

.....

4

2 に答える 2

0

••• 注•••• ここの入力ファイルは、最近のブロックされた質問に固有のものです ( perl を使用して、各行に同じ単語がある場合に最後の 2 行を選択するには?(再質問..) )したがって、その入力でのみ機能します。

これはあなたが最近提供した入力です:

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」で始まる最後から2番目の行から最後の2つの要素を抽出し、「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 に答える