perl – 在程序中使用__DATA__

它一直用在Stack Overflow上,但我真的不理解它,也不能让它工作.然而,它似乎是一个非常好的测试工具.

如何让脚本在__DATA__下面的所有内容中读入文件句柄?我尝试了几种方法来阅读它,而不是在外部文件添加.数据是合法的,它来自AutoSys JIL文件中的作业定义.

#!/efs/dist/perl5/core/5.10/exec/bin/perl

use strict;
use warnings;

my ( $job,$machine,$command,@line_stat );

#these 4 lines below do not read in data to filehandle
#my $data = do  {
#   local $/;
#   <DATA>;
#} ;

my $data = <DATA>;    # does not work either

open( my $fh,'<:encoding(UTF-8)',$data )
        or die "Could not open file '$data' $!";

my $count = 0;

while ( my $line = <$fh> ) {

    #chomp $line;
    if ( $line =~ /\/\* -{17} \w+ -{17} \*\// ) {
        $count = 1;
    }
    elsif ( $line =~ /(alarm_if_fail:)/ ) {
        $count = 0;
    }
    elsif ( $count ) {

        if ( $line =~ m/insert_job: (\w+).*job_type: CMD/ ) {
            push( @line_stat,$1 );
        }
        elsif ( $line =~ m/command:(.*)/ ) {
            push( @line_stat,$1 );
        }
        elsif ( $line =~ m/machine:(.*)/ ) {
            push( @line_stat,$1 );
        }
    }
}

foreach my $line_wot ( @line_stat ) {
    print "$line_wot\n";
}

__DATA__
/* ----------------- COME_AND_PLAY_WITH_US_DANNY ----------------- */

insert_job: COME_AND_PLAY_WITH_US_DANNY   job_type: CMD
command: /bin/bash -pwd
machine: capser.com
owner: twins
permission: foo,foo
date_conditions: 1
days_of_week: mo,tu,we,th,fr
start_times: "04:00"
description: "Forever,and ever and ever"
std_in_file: "/home/room217"
std_out_file: "${CASPERSYSLOG}/room217.out"
std_err_file: "${CASPERSYSLOG}/room217.err
alarm_if_fail: 1
profile: "/autosys_profile"
timezone: US/Eastern

/* ----------------- COME_AND_PLAY_WITH_US_AGAIN_DANNY ----------------- */

insert_job: COME_AND_PLAY_WITH_US_AGAIN_DANNY   job_type: CMD
command: /bin/bash -ls
machine: capser1.com
owner: twins
permission: foo,and ever and ever"
std_in_file: "/home/room217"
std_out_file: "${CASPERSYSLOG}/room217.out"
std_err_file: "${CASPERSYSLOG}/room217.err
alarm_if_fail: 1
profile: "/autosys_profile"
timezone: US/Eastern

/* ----------------- NEVER_PLAY_WITH_US_AGAIN_DANNY ----------------- */

insert_job: NEVER_PLAY_WITH_US_AGAIN_DANNY   job_type: CMD
command: /bin/bash -rm *
machine: capser2.com
owner: twins
permission: foo,and ever and ever"
std_in_file: "/home/room217"
std_out_file: "${CASPERSYSLOG}/room217.out"
std_err_file: "${CASPERSYSLOG}/room217.err
alarm_if_fail: 1
profile: "/autosys_profile"
timezone: US/Eastern

解决方法

您无需打开DATA文件句柄,只需从中读取即可.
while (my $line = <DATA>) {
    ...
}

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...