Почему gedit не распознает кодировку моего выходного файла, созданного из Perl-программы? - PullRequest
1 голос
/ 04 сентября 2010
#!/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 Ответ

1 голос
/ 16 октября 2010

Полагаю, это не кодирование (как, скажем, 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

Или использовать сплайс на сплите? Или ...

...