gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:36:38 24 4
gpt4 key购买 nike

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

这是我的代码:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com