perl - 如何在perl中以相反的方向读取文件

标签 perl

我正在尝试编写搜索关键字的脚本。一旦我得到那个关键字,我就必须回溯文件,我的意思是我必须开始以相反的方向读取文件,直到我得到所需的行。

这是我的代码:

use strict;
use warnings;
open(my $f1,"<","$file") or die "can not open the file $!\n";
open(my $f2,">","$file_01") or die "can not open the file $!\n";
my @eof =<$f1>;

    for(my $i=0;$i<=$#eof;$i++)
      {
         my $line=$eof[$i];
          if($line=~ m/installd: eof/gi)
         {
            print $line $f2;
            my $j=$i;
            for($j;$j<=0;$j--)
            {
            my $back_line=$eof[$j];
             if($back_line=~ m/Fatal/gi)
              {
                print $back_line $f2;
                exit;
              }
            }
          }
              }

这是日志:

06-05 16:37:43.903   274   404 E ThermalEngine: algo_monitor: Timer EVT
06-05 16:37:43.903   274   404 E ThermalEngine: handle_timer_sig: SS Id SS-POPMEM Read pop_mem 53000mC, Err 27000mC, SampleCnt 5
06-05 16:37:43.903   274   404 E ThermalEngine: handle_timer_sig: SS Id SS-CPU3 Read cpu3 54000mC, Err 36000mC, SampleCnt 5
06-05 16:37:43.903   274   404 E ThermalEngine: handle_timer_sig: SS Id SS-CPU2 Read cpu2 54000mC, Err 36000mC, SampleCnt 5
06-05 16:37:43.903   274   404 E ThermalEngine: handle_timer_sig: SS Id SS-CPU1 Read cpu1 57000mC, Err 33000mC, SampleCnt 5
06-05 16:37:43.903   274   404 E ThermalEngine: handle_timer_sig: SS Id SS-CPU0 Read cpu0 63000mC, Err 27000mC, SampleCnt 5
06-05 16:37:43.903   274   404 E ThermalEngine: settimer: Start timer 0.325(sec)
06-05 16:37:43.903   274   404 E ThermalEngine: algo_monitor: Wait for EV
06-05 16:37:43.943 16232 16232 D StatusBar.NetworkController: onDataActivity: direction=0
06-05 16:37:43.943 16232 16232 D StatusBar.NetworkController: refreshViews connected={ data } level=4 combinedSignalIconId=0x7f020138/com.android.systemui:drawable/stat_sys_signal_4 combinedActivityIconId=0x0 mobileLabel=AIRCEL wifiLabel= emergencyOnly=false combinedLabel=AIRCEL mAirplaneMode=false mDataActivity=0 mPhoneSignalIconId=0x7f020138 mQSPhoneSignalIconId=0x7f02005f mDataDirectionIconId=0x7f020113 mDataSignalIconId=0x7f020138 mDataTypeIconId=0x7f020113 mQSDataTypeIconId=0x7f020061 mNoSimIconId=0x0 mWifiIconId=0x0 mQSWifiIconId=0x0 mBluetoothTetherIconId=0x1080563
06-05 16:37:43.943 16232 16232 D StatusBar.NetworkController: changing data overlay icon id to 0
06-05 16:37:43.953 16090 16091 F libc    : **Fatal signal** 11 (SIGSEGV) at 0x5f106dc8 (code=1), thread 16091 (SurfaceFlinger)
06-05 16:37:44.243   274   404 E ThermalEngine: algo_monitor: Timer EVT
06-05 16:37:44.243   274   404 E ThermalEngine: handle_timer_sig: SS Id SS-POPMEM Read pop_mem 53000mC, Err 27000mC, SampleCnt 5
06-05 16:37:44.243   274   404 E ThermalEngine: handle_timer_sig: SS Id SS-CPU3 Read cpu3 54000mC, Err 36000mC, SampleCnt 5
06-05 16:37:44.243   274   404 E ThermalEngine: handle_timer_sig: SS Id SS-CPU2 Read cpu2 54000mC, Err 36000mC, SampleCnt 5
06-05 16:37:44.243   274   404 E ThermalEngine: handle_timer_sig: SS Id SS-CPU1 Read cpu1 57000mC, Err 33000mC, SampleCnt 5
06-05 16:37:44.243   274   404 E ThermalEngine: handle_timer_sig: SS Id SS-CPU0 Read cpu0 63000mC, Err 27000mC, SampleCnt 5
06-05 16:37:44.243   274   404 E ThermalEngine: settimer: Start timer 0.325(sec)
06-05 16:37:44.243   274   404 E ThermalEngine: algo_monitor: Wait for EV
06-05 16:37:44.263   262   262 I DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-05 16:37:49.193   256   256 I ServiceManager: service 'audio' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'network_management' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'textservices' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'netstats' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'netpolicy' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'wifip2p' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'uimode' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'dropbox' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'cneservice' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'country_detector' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'connectivity' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'servicediscovery' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'throttle' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'updatelock' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'commontime_management' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'devicestoragemonitor' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'notification' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'search' died
06-05 16:37:49.193   256   256 I ServiceManager: service 'location' died
06-05 16:37:49.213  8379  8379 W AudioFlinger: power manager service died !!!
06-05 16:37:49.213  8379  8379 W AudioFlinger: power manager service died !!!
06-05 16:37:49.213   300  1913 I Atfwd_Sendcmd: AtCmdFwd : binderDied
06-05 16:37:49.223   300  1913 I ServiceManager: Waiting for service AtCmdFwd...
06-05 16:37:49.233   268   268 E **installd: eof**
06-05 16:37:49.233   268   268 E installd: failed to read size
06-05 16:37:49.233   268   268 I installd: closing connection
06-05 16:37:49.233   268   268 I installd: new connection
06-05 16:37:49.243 30568 30588 I SystemServer: Entropy Mixer
06-05 16:37:49.283 30568 30588 I QCOM PowerHAL: QCOM power HAL initing.
06-05 16:37:49.283 30568 30588 I SystemServer: Power Manager

在上面的日志中,我首先搜索 :EOF 一旦我得到那个关键字,然后我必须以相反的方向读取文件,直到我得到 FATAL(仅限第一次遇到)。我正在其他文件中打印这两个信息。

对我来说,逻辑似乎是正确的,但在运行该程序时出现错误。我们还有其他方法来执行此任务吗?

最佳答案

不,您永远不会向后读取文件。至少在任何像这样简单的场景中都不会。您只需存储最后读取的 Fatal 匹配项并在找到 eof 时打印它:

my $fatal;
while (<>) {
    if (/Fatal/) {
        $fatal = $_;          # store line for later
    }
    if (/installd: eof/) {
        print $fatal;         # stored line
        print $_;             # current line
    }
}

请注意,我删除了您的正则表达式中的 /gi 选项,因为它们在这里是多余的。您不需要不区分大小写的匹配,也不需要匹配多次。

关于perl - 如何在perl中以相反的方向读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16999290/

相关文章:

perl - 如何将我的数据重新排列为 GD::Graph 的 (x,y) 坐标?

perl - 如何在 perl 中解析 .chm 文件?

mysql - Perl DBI/Mysql Unicode 错误

perl - 如何在不影响主包的情况下为长包名起别名?

perl - 引用带有标量的子例程

perl - 如果文件已排序,为什么 Tie::File 会添加一行?

perl - 在 Perl 中覆盖 die 并在 Windows 上仍然返回正确的退出代码

sql-server - 如何在与我所在的服务器不同的服务器上运行 perl 脚本(通过 BAT 文件)?

perl - 如何更改 Perl 中的日期格式?

linux - 如何使用dos2unix?