Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用特定字符串拾取特定行_Perl - Fatal编程技术网

Perl 使用特定字符串拾取特定行

Perl 使用特定字符串拾取特定行,perl,Perl,我试图用Perl从包含“CURRENT_RUN_ID”的整个文档中选取一行完整的内容。我一直在使用下面的代码来完成上述任务,但我无法进入while循环 my $sSuccessString = "CURRENT_RUN_ID"; open(LOG, "$slogfile") or die("Can't open $slogfile\n"); my $sLines; { local $/ = undef; $sLines=<LOG>; } my $spool = 0;

我试图用Perl从包含“CURRENT_RUN_ID”的整个文档中选取一行完整的内容。我一直在使用下面的代码来完成上述任务,但我无法进入while循环

my $sSuccessString = "CURRENT_RUN_ID";

open(LOG, "$slogfile") or die("Can't open $slogfile\n");
my $sLines;
{
    local $/ = undef;
    $sLines=<LOG>;
}
my $spool = 0;
my @matchingLines;

while (<LOG>) 
{
    print OUTLOG "in while loop\n";

    if (m/$sSuccessString/i) {
        print OUTLOG "in if loop\n";
        $spool = 1;
        print map { "$_ \n" } @matchingLines;
        @matchingLines = ();
    }
    if ($spool) {
        push (@matchingLines, $_);
    }
}
my$ssuccesstring=“当前运行ID”;
打开(日志,“$slogfile”)或死亡(“无法打开$slogfile\n”);
我的$sLines;
{
本地$/=undef;
$sLines=;
}
我的$spool=0;
我的@matchingLines;
而()
{
打印输出日志“在循环期间\n”;
如果(m/$SSAccessString/i){
打印输出日志“在if循环中\n”;
$spool=1;
打印地图{“$\un”}@matchingLines;
@匹配线=();
}
如果($spool){
推送(@matchingLines,$);
}
}

在将文件句柄
日志读入
$sLines
后,您已经完成了从该文件句柄
日志的读取<代码>
的头部,而
将返回
undef
,因为它已达到
eof
。您要么在
循环时在
中使用该变量
$sLines
,要么将其删除。反正你也不用

如果只想打印匹配的行,则只需执行以下操作:

use strict;
use warnings;

open my $fh_in, '<', 'input_file' or die $!;
open my $fh_out '>', 'output_file' or die $!;

while (my $line = <$fh_in>) {
  print $fh_out $line if $line =~ m/CURRENT_RUN_ID/;
}

close $fh_in;
close $fh_out;
使用严格;
使用警告;
打开我的$fh_in、、'output_file'或die$!;
while(我的$line=){
如果$line=~m/CURRENT_RUN_ID/,则打印$fh_out$line;
}
以年收盘价$fh_;
关闭$fh_;

执行此代码时:

$sLines=<LOG>;
由于没有更多的数据可读取,因此不会返回任何内容

如果要读取文件两次,则需要在第二次读取之前使用
seek()
函数重置文件指针

seek LOG, 0, 0;
但是,考虑到您从未使用
$sLines
执行任何操作,我怀疑您可能可以删除整个代码部分

使用
$spool
@matchingLines
的整个过程似乎也很奇怪。你想在那里实现什么

我认为您的代码可以简化为:

my $sSuccessString = "CURRENT_RUN_ID";

open(LOG, $slogfile) or die("Can't open $slogfile\n");

while (<LOG>) {
    print OUTLOG if /$sSuccessString/i/;
}
my$ssuccesstring=“当前运行ID”;
打开(日志,$slogfile)或死亡(“无法打开$slogfile\n”);
而(){
如果/$SSAccessString/i/,则打印输出日志;
}
就我个人而言,我会让它变得更简单,从STDIN阅读,然后写信给STDOUT

my $sSuccessString = 'CURRENT_RUN_ID';

while (<>) {
    print if /$sSuccessString/i/;
}
my$ssuccesstring='CURRENT_RUN_ID';
而(){
打印if/$ssuccesstring/i/;
}
然后使用Unix I/O重定向连接正确的文件

$ ./this_filter.pl < your_input.log > your_output.log
$。/this\u filter.plyour\u output.log

当我看到一个名为
$ssuccesstring
的变量时,我能想到的只是“noooooooo!!!”事实上,你违反了匈牙利符号的精神。Perl中的所有内容都可以字符串化。。。因此,不需要两个提示,即变量是带有
s
前缀和
string
后缀的字符串。相反,
my$success\u re=qr/CURRENT\u RUN\u ID/i
我的$log\u fname=…
实际上符合匈牙利符号的精神。嗨,simbabque,我试着实现你的代码,将“$slogfile”保留为输入文件,并为输出文件保留一个新名称,但得到(在严格subs时不允许使用裸字“output\u file”)错误。请suggest@Sur这是一个语法错误。您可能忘记了变量名上的
$
,或者忘记了引用文件名。只需阅读信息所指的那一行即可。这将是相当明显的
$ ./this_filter.pl < your_input.log > your_output.log