代码之家  ›  专栏  ›  技术社区  ›  Brian T Hannan

为什么Gedit不能识别从Perl程序创建的输出文件的编码?

  •  1
  • Brian T Hannan  · 技术社区  · 14 年前
    #!/usr/bin/perl -w
    use strict;
    
    open (EVENTLOGFILE, "<eventlog.txt") || die("Could not open file eventlog file");
    open (EVENTLOGFILE_NODATETIME, ">eventlog_nodatetime.txt") || die("Could not open new event log file");
    
    
    my($line) = "";
    
    while ($line = <EVENTLOGFILE>) {
     my @fields = split /[ \t]/, $line;
     my($newline) = "";
     my($i) = 1;
    
     foreach( @fields )
     {
      my($field) = $_;
      if( $i ne 3 )
      {
       $newline = $newline . $field;
      }
    
      $i++;
     }
    
     print EVENTLOGFILE_NODATETIME "$newline";
    }
    
    close(EVENTLOGFILE);
    close(EVENTLOGFILE_NODATETIME); 
    

    如果我每次打印$line而不是$newline,它就可以检测到编码没有问题。只有当我试图修改线条时,它才会变得混乱。

    1 回复  |  直到 14 年前
        1
  •  1
  •   RedGrittyBrick    14 年前

    我想这不是编码(比如说ISO 8859-1和UTF-8),而是行尾(CR,LF和LF)。

    如果您使用chomp并打印\n“,您可能会将行尾转换为平台本机的行尾。

    我想你的剧本最好是这样写的( 未经测试的 ):

    #!/usr/bin/perl 
    use strict;
    use warnings;
    
    open ($old, '<', 'eventlog.txt') or die 'Could not open eventlog.txt';
    open ($new, '>', 'eventlog_nodatetime.txt') 
      or die 'Could not open eventlog.nodatetime.txt');
    
    $\ = "\n";
    
    while (<$old>) {
      chomp;
      s/^(\S+\s+\S+\s+)\S+\s+(.*)/$1$2/;
      print $new;
    }
    
    close $old;
    close $new; 
    

    perl -pe 's/^(\S+\s+\S+\s+)\S+\s+(.*)/$1$2/' eventlog.txt >eventlog.nodatetime.txt
    

    或者用一个接头在一个裂口上? 或者…