在perl

时间:2016-04-06 08:49:41

标签: perl

我正在解析日志文件,并且我需要每1秒,5分钟,5分钟,15分钟,30小时,1小时生成包含结果的JSON文件..等等

我对这里的概念感到困惑,有可能编写一个大的无限while循环,其中包含多个子程序,每个子程序将根据不同的时间间隔执行解析。

到目前为止,我还没有确定这是否是正确的方法

#!/usr/bin/perl

use strict;
use warnings;

$ | = 1; # Ensure output appears

my $interval = 1;
my @command = "echo processing ...";

my $count = 0;

while (1) {
    `since access.log | json_convert.pl 

    sleep $interval - time % $interval;
    system @command;
}

1 个答案:

答案 0 :(得分:1)

重复的CREATE PROCEDURE sp_generate_insertscripts ( @TABLENAME VARCHAR(MAX), @FILTER_CONDITION VARCHAR(MAX)='' -- where TableId = 5 or some value ) AS BEGIN SET NOCOUNT ON DECLARE @TABLE_NAME VARCHAR(MAX), @CSV_COLUMN VARCHAR(MAX), @QUOTED_DATA VARCHAR(MAX), @TEXT VARCHAR(MAX), @FILTER VARCHAR(MAX) SET @TABLE_NAME=@TABLENAME SELECT @FILTER=@FILTER_CONDITION SELECT @CSV_COLUMN=STUFF ( ( SELECT ',['+ NAME +']' FROM sys.all_columns WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND is_identity!=1 FOR XML PATH('') ),1,1,'' ) SELECT @QUOTED_DATA=STUFF ( ( SELECT ' ISNULL(QUOTENAME('+NAME+','+QUOTENAME('''','''''')+'),'+'''NULL'''+')+'','''+'+' FROM sys.all_columns WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND is_identity!=1 FOR XML PATH('') ),1,1,'' ) SELECT @TEXT='SELECT ''INSERT INTO '+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER --SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT EXECUTE (@TEXT) SET NOCOUNT OFF END 调用会迅速发生变化,因为它们没有考虑创建JSON数据所花费的时间。我也非常谨慎地使用sleep调用来进行数据操作,因为它必然会减慢速度,并且你可能会超出你正在寻找的一秒响应时间。在Perl中完成所有工作

我建议您查看优秀的EV模块。 周期性事件类型是您需要的

这是一个非常简短的例子。你自己的回调子程序应该检查它被调用的时间,以确定要做什么,根据它是5秒,60秒等的倍数。或者你可以设置多个事件循环,每个间隔一个。该模块非常简单

system

输出

use strict;
use warnings 'all';
use feature 'say';

use EV;
use Time::Piece 'localtime';

STDOUT->autoflush;

my $one_second = EV::periodic 1, 1, 0, \&callback;

sub callback {
  say "Periodic event at ", localtime(EV::now)->hms;
};

EV::run;