无法使用perl打印到输出文件

无法使用perl打印到输出文件,perl,Perl,我是初学者perl程序员。我有下面的perl代码片段,无法理解为什么不能将ascii字符($ascii_chr)打印到输出文件。当我打印到控制台时,它似乎工作正常 无法理解为什么在下面的打印语句中不将字符转储到OUTFILE print OUTFILE $ascii_chr; ## But this print statement does not work. 下面是这个特定循环的代码片段 #Now look for start_conversion = 1 and then conv

我是初学者perl程序员。我有下面的perl代码片段,无法理解为什么不能将ascii字符($ascii_chr)打印到输出文件。当我打印到控制台时,它似乎工作正常

无法理解为什么在下面的打印语句中不将字符转储到OUTFILE

 print OUTFILE $ascii_chr;  ## But this print statement does not work.  
下面是这个特定循环的代码片段

#Now look for start_conversion = 1 and then convert the hex data into ascii data
if (($start_conversion == 1) && ($_ != '5f535452') && ($_ != '5f454e44'))  {
    chomp;
    $_ =~ s/000000/ 0x/g;
    @my_array = split(/ /, $_); 
    foreach $split_word(@my_array) {
        $ascii_chr = chr(hex($split_word));
        print $ascii_chr;       ## This print statement works.  
        print OUTFILE $ascii_chr;  ## But this print statement does not work.  
    }
}
这是完整的代码。我尝试了几种方法,但无法打印输出文件

#!/usr/bin/perl
$num_arg = $#ARGV + 1;
if (($ARGV[0] =~ /help/)) {
 print "post_code_log.pl <inputfile> <outputfile> \n";
 exit;
}
$infile_name = $ARGV[0];
$outfile_name = $ARGV[1];

#Logic to remove non-ascii characters from a text file
$count            = 0;
$start_num        = '5f535452';
$stop_num         = '5f454e44';
$start_conversion = 0;
open (DATA,    "$infile_name");
open (OUTFILE, ">$outfile_name");
while (<DATA>) {
    s/^;.*//g;  # Remove a line starting with ;
    s/^\n//g;   # Remove blank lines
    s/.*?://;   # Remove first column 
    s/.*?Port80Wr//; # Remove the first column look for Port80Wr  
                     # (since the first column contains "Port80Wr")
    s/^\s+//g;  # Remove the space in front

    #Look for start signature
    if ($_ =~ '5f535452') {
        print $_;
        $start_conversion = 1;
    } 
    #Look for stop signature 
    if ($_ =~ '5f454e44') {
        print OUTFILE "\n";  # May need to print newline
        print $_;
        $start_conversion = 0;
    }
    # Now look for conversion start and then convert hex to ascii 
    if (($start_conversion == 1) && ($_ != '5f535452') && ($_ != '5f454e44')) {
        chomp;
        $_ =~ s/000000/ 0x/g;
        @my_array = split(/ /, $_); 
        foreach $split_word(@my_array) {
            $ascii_chr = chr(hex($split_word));
             print $ascii_chr;
             print OUTFILE $ascii_chr;
        }
    }
    # Now look for conversion end and send the data 
    # as is without making any changes
    if (($start_conversion == 0) && ($_ != '5f535452') && ($_ != '5f454e44')) {
        print OUTFILE $_;
    }
}
print "Done\n";
#/usr/bin/perl
$num_arg=$#ARGV+1;
如果($ARGV[0]=~/help/){
打印“post\u code\u log.pl\n”;
出口
}
$infie_name=$ARGV[0];
$outfile_name=$ARGV[1];
#从文本文件中删除非ascii字符的逻辑
$count=0;
$start_num='5f535452';
$stop_num='5f454e44';
$start_转换=0;
开放(数据,“$infle_name”);
打开(OUTFILE,“>$OUTFILE_name”);
而(){
s//^;*//g;#删除以开头的行;
s/^\n//g;#删除空行
删除第一列
s/*?Port80Wr/#删除Port80Wr的第一列查找
#(因为第一列包含“Port80Wr”)
s/^\s+//g;#删除前面的空格
#寻找开始签名
如果($\ux=~'5f535452'){
打印美元;
$start_转换=1;
} 
#寻找停止签名
如果($\u0=~'5f454e44'){
打印输出文件“\n”#可能需要打印换行符
打印美元;
$start_转换=0;
}
#现在查找转换开始,然后将十六进制转换为ascii
如果($start_conversion==1)&&($!='5F5354452')&($!='5f454e44')){
咀嚼;
$\ux=~s/000000/0x/g;
@my_数组=拆分(/,$);
foreach$split\u单词(@my\u数组){
$ascii_chr=chr(十六进制($split_word));
打印$ascii_chr;
打印输出文件$ascii_chr;
}
}

#现在查找转换结束并发送数据 #照原样,不做任何改变 如果($start_conversion==0)和($!='5F5354452')&($!='5f454e44')){ 打印输出文件$; } } 打印“完成”\n;
检查您的文件是否真正打开:

open (OUTFILE, ">", $outfile_name) or die "Cannot open '$outfile_name': $!";
在代码顶部附近添加以下内容:

use warnings;

您应该使用。如果添加
使用警告
,您可能会得到有关错误的信息。我猜您将在未打开的filehandle输出文件上获得
print()
。您是在程序完成后检查还是在程序仍在运行时检查?在程序完成运行后,它可能根本没有写入文件yetI am checking。在其他地方,“打印到输出文件”手柄工作正常。例如,这里#现在查找start_conversion=0在本例中,如果($start_conversion==0)和($!!='5f535452')&($!!='5f454e44'){print“in Stop_conversion\n;print OUTFILE$!}@CharubenPandya不在注释中添加代码和文件内容,则只需按原样发送数据而不做任何更改,使用
edit
按钮并将其添加到问题的主体。最好使用open的3参数形式。输出文件已打开。因为它是从上面的perl代码中的其他循环打印的。@CharubenPandya上面的perl代码中没有其他循环打印到输出文件句柄。下面的代码使用输出文件句柄#现在查找转换结束并按原样发送数据,如果($start#u conversion==0)和($\u!='5f535452')&&($\u!='5f454e44'){打印输出文件$\u;}