在程序中使用 __DATA__
Using __DATA__ in a program
它一直在 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, );
}
elsif ( $line =~ m/command:(.*)/ ) {
push( @line_stat, );
}
elsif ( $line =~ m/machine:(.*)/ ) {
push( @line_stat, );
}
}
}
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,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
/* ----------------- 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,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
您不需要打开 DATA
文件句柄,只需从中读取即可。
while (my $line = <DATA>) {
...
}
如 perldata
中所述:
Text after __DATA__ may be read via the filehandle PACKNAME::DATA , where PACKNAME is the package that was current when the __DATA__ token was encountered. The filehandle is left open pointing to the line after __DATA__
有关 __DATA__
的更多说明,请参见 SelfLoader
它一直在 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, );
}
elsif ( $line =~ m/command:(.*)/ ) {
push( @line_stat, );
}
elsif ( $line =~ m/machine:(.*)/ ) {
push( @line_stat, );
}
}
}
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,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
/* ----------------- 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,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
您不需要打开 DATA
文件句柄,只需从中读取即可。
while (my $line = <DATA>) {
...
}
如 perldata
中所述:
Text after __DATA__ may be read via the filehandle PACKNAME::DATA , where PACKNAME is the package that was current when the __DATA__ token was encountered. The filehandle is left open pointing to the line after __DATA__
有关 __DATA__
的更多说明,请参见 SelfLoader