2017-10-23 47 views
6

Jest używane przez cały czas w przepełnieniu stosu, ale naprawdę go nie rozumiem i nie mogę go uruchomić. Jednak wygląda na to, że jest naprawdę dobrym narzędziem do testowania.Używanie __DATA__ w programie

Jak uzyskać skrypt do odczytu we wszystkim poniżej __DATA__ w uchwycie pliku? Próbowałem go przeczytać na kilka sposobów, zamiast sczepić plik zewnętrzny. Dane są poprawne, pochodzą z pliku JIL AutoSys dla definicji zadań.

#!/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,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 
+0

'my $ fh = \ * DANYCH;' 'zamiast otwierać my $ fh ... –

+1

Dla' klarowność preferuję jawne wyjście() tuż przed __DATA__. – ulix

+0

'DATA' _is_ a filehandle, podobnie jak' STDIN'; odczytuje dane zgodne ze specjalnym literałem "__DATA__". Zobacz [\ _ \ _ DATA \ _ \ _] (http://perldoc.perl.org/functions/__DATA__.html) (ma link do 'perldata') i na przykład [ten post] (https: // stackoverflow.com/questions/13463509/the-data-syntax-in-perl). – zdim

Odpowiedz

14

Nie trzeba otworzyć DATA uchwytu pliku, tylko do odczytu z niego.

while (my $line = <DATA>) { 
    ... 
} 
+3

Tak, podobnie jak STDIN, STDOUT i STERR, dane są automatycznie otwierane. – shawnhcorey

0

Jak udokumentowano w perldata:

Tekst po __DATA__ mogą być odczytywane za pośrednictwem packname filehandle :: danych, gdzie packname jest pakiet, który był obecny podczas token __DATA__ napotkano. Uchwytu pliku pozostaje otwarty wskazując na linię po __DATA__

Zobacz SelfLoader więcej opisem __DATA__