2014-07-24 141 views
1

所以我有這個代碼從命令行獲取輸入和輸出文件,然後將一定的輸出寫入輸出文件(由於隱私問題,此處僅顯示相關部分):Perl:無法將輸出寫入文件

use strict; 
use warnings; 
use autodie; 

# check that two arguments have been passed 
die "usage: $0 input output\n" unless @ARGV == 2; 

my $infile = shift; 
my $outfile = shift; 

open my $in, "<", $infile; 
open(DATA, $in); 
open my $out, ">", $outfile; 

my %DEF = (
    I => [ qw(P Pl P.P P.Pl Pl.P Pl.Pl P.P.P P.P.Pl P.Pl.P P.Pl.Pl Pl. +P.P Pl.P.Pl Pl.Pl.P Pl.Pl.Pl) ], 
    II => [ qw(E P.E Pl.E P.P.E P.Pl.E Pl.P.E Pl.Pl.E) ], 
    III => [ qw(E.P E.Pl P.E.P P.E.Pl Pl.E.P Pl.E.Pl E.P.P E.P.Pl E.Pl.P + E.Pl.Pl) ], 
    IV => [ qw(E.E P.E.E Pl.E.E E.P.E E.Pl.E E.E.P E.E.Pl E.E.E) ] 
); 
# Hash table/dictionary for all the groups 

my @rank = map @$_, @DEF{qw(I II III IV)}; 
my %rank = map { $rank[$_ - 1] => $_ } 1 .. @rank; 
my @group = map { ($_) x @{ $DEF{$_} } } qw(I II III IV); 
my %group = map { $rank[$_ - 1] => $group[$_ - 1] . "_" . $_ } 1 .. @group; 

sub rank { 
    $rank{ $a->[2] } <=> $rank{ $b->[2] } 
} 

my %T; 

sub oh { 
    map values %$_, @_; 
} 

sub ab { 
    my ($b, $a) = @_; 
    [$b->[0], $a->[1], qq($a->[2].$b->[2]), qq($b->[3]<-$a->[3])]; 
} 

sub xtend { 
    my $a = shift; 
    map { ab $_, $a } oh @{ $T{ $a->[0] } }{@_}; 
} 

sub ins { 
    $T{ $_[3] //= $_[1] }{ $_[2] }{ $_[0] } = \@_; 
} 

ins split /,\s*/ for <DATA>; 

#ins split /,\s*/ for $filename; 
ins @$_ for map { xtend $_, qw(P E Pl) } (oh oh oh \%T); 
ins @$_ for map { xtend $_, qw(P E Pl) } (oh oh oh \%T); 

for (sort { rank } grep { $_->[1] eq 'Q' } (oh oh oh \%T)) { 

    print $out "%-4s: %20s, %-8s %6s\n", 
     $_->[0], 
     qq($_->[0]$_->[3]), 
     $_->[2], 
     $group{ $_->[2] }; 

    close $in; 
    close $out; 
} 

問題是它沒有寫任何東西到輸出文件。

perl program.pl input_file output_file 

由於某些原因,我想以格式讀取輸入文件,以至於無法完成。

請幫

input_file 
M19,Q,P, 
M31,M19,Pl, 
M420,M31,E, 
M421,M31,E, 
M33,M31,E, 
M438,M33,Pl, 
M445,M33,E, 
M437,M33,E, 
M444,M33,E, 
M73,M33,E, 
M552,M73,Pl, 
M553,M73,Pl, 
M569,M73,E, 
M549,M73,E, 
M550,M73,E, 
+0

什麼是'開放(DATA,在$);'怎麼辦呢? –

+0

另外,「_I要在format_中的輸入文件中讀取」是什麼意思? –

+0

大概你得到*「打印()關閉文件句柄」*錯誤?如果你可以讓我們獲得這樣的信息,這將是一件好事 – Borodin

回答

2

的主要問題,我可以看到的是,這些

  • open(DATA, $in)是沒有意義的。我想你想從DATA文件句柄數據,在這種情況下,你要

    my $in = \*DATA; 
    
  • 您關閉兩個文件句柄最終for迴路測試程序。這意味着,只有一行將永遠不會寫入到輸出,之後你會得到警告

    印刷()在封閉的文件句柄

  • 您正在使用print用的格式。您需要printf代替

程序的這一版本修復了這些東西,併產生一些輸出。這是你所期望的嗎?

use strict; 
use warnings; 
use autodie; 

# check that two arguments have been passed 
# die "usage: $0 input output\n" unless @ARGV == 2; 

my ($infile, $outfile) = @ARGV; 
# open my $in_fh, '<', $infile; 
# open my $out_fh, '>', $outfile; 

my $in_fh = \*DATA; 
my $out_fh = \*STDOUT; 

my %DEF = (
    I => [ qw(P Pl P.P P.Pl Pl.P Pl.Pl P.P.P P.P.Pl P.Pl.P P.Pl.Pl Pl. +P.P Pl.P.Pl Pl.Pl.P Pl.Pl.Pl) ], 
    II => [ qw(E P.E Pl.E P.P.E P.Pl.E Pl.P.E Pl.Pl.E) ], 
    III => [ qw(E.P E.Pl P.E.P P.E.Pl Pl.E.P Pl.E.Pl E.P.P E.P.Pl E.Pl.P + E.Pl.Pl) ], 
    IV => [ qw(E.E P.E.E Pl.E.E E.P.E E.Pl.E E.E.P E.E.Pl E.E.E) ] 
); 
# Hash table/dictionary for all the groups 

my @rank = map { @$_ } @DEF{qw(I II III IV)}; 
my %rank = map { $rank[$_ - 1] => $_ } 1 .. @rank; 
my @group = map { ($_) x @{ $DEF{$_} } } qw(I II III IV); 
my %group = map { $rank[$_ - 1] => $group[$_ - 1] . "_" . $_ } 1 .. @group; 

my %T; 

sub rank { 
    $rank{ $a->[2] } <=> $rank{ $b->[2] } 
} 

sub oh { 
    map values %$_, @_; 
} 

sub ab { 
    my ($b, $a) = @_; 
    [ $b->[0], $a->[1], qq($a->[2].$b->[2]), qq($b->[3]<-$a->[3]) ]; 
} 

sub xtend { 
    my $a = shift; 
    map { ab $_, $a } oh @{ $T{ $a->[0] } }{@_}; 
} 

sub ins { 
    $T{ $_[3] //= $_[1] }{ $_[2] }{ $_[0] } = \@_; 
} 

ins split /,\s*/ for <$in_fh>; 
close $in_fh; 

ins @$_ for map { xtend $_, qw(P E Pl) } (oh oh oh \%T); 
ins @$_ for map { xtend $_, qw(P E Pl) } (oh oh oh \%T); 

for (sort { rank } grep { $_->[1] eq 'Q' } (oh oh oh \%T)) { 

    printf $out_fh "%-4s: %20s, %-8s %6s\n", 
     $_->[0], 
     qq($_->[0]$_->[3]), 
     $_->[2], 
     $group{ $_->[2] }; 
} 

close $out_fh; 

__DATA__ 
M19,Q,P, 
M31,M19,Pl, 
M420,M31,E, 
M421,M31,E, 
M33,M31,E, 
M438,M33,Pl, 
M445,M33,E, 
M437,M33,E, 
M444,M33,E, 
M73,M33,E, 
M552,M73,Pl, 
M553,M73,Pl, 
M569,M73,E, 
M549,M73,E, 
M550,M73,E, 

輸出

M19 :     M19Q, P   I_1 
M31 :   M31M19<-Q, P.Pl  I_4 
M421:  M421M31<-M19<-Q, P.Pl.E II_20 
M420:  M420M31<-M19<-Q, P.Pl.E II_20 
M33 :  M33M31<-M19<-Q, P.Pl.E II_20 
+0

我認爲OP希望'DATA'句柄從文件中讀取,所以'* DATA = * $ in' – mob