Ajouter la nouvelle ligne du système par défaut dans Perl

Lorsque j’ajoute du texte à un fichier, j’aimerais append la fin de ligne correcte pour le fichier: pour Unix: "\n" et pour Windows "\r\n" . Cependant, je n’ai pas pu trouver un moyen facile de le faire. C’était le meilleur que je puisse trouver:

 use ssortingct; use warnings; use Devel::CheckOS (); my $fn = 'file'; open (my $fh, '<', $fn) or die "Could not open file '$fn': $!\n"; my $first_line = ; my $len = length $first_line; my $file_type = "undetermined"; if ($len == 1) { $file_type = "Unix" if $first_line eq "\n"; } if ($len >= 2) { if (substr($first_line, $len - 1, 1) eq "\n") { if (substr($first_line, $len - 2, 1) eq "\r") { $file_type = "DOS"; } else { $file_type = "Unix"; } } } close $fh; if ($file_type eq "undetermined") { $file_type = get_system_file_type(); } print "File type: $file_type.\n"; sub get_system_file_type { return Devel::CheckOS::os_is('MicrosoftWindows') ? "DOS" : "Unix"; } 

Est-il vraiment nécessaire de faire tous ces contrôles? Ou existe-t-il des moyens plus simples de le faire?

Utilisez le :crlf , par exemple avec use open et use if :

 use if ($^O eq "MSWin32") => open qw(IO :crlf :all); 

Les documentations pertinentes:

  • PerlIO pour les io couches. Notez que cette page indique:

Si la plate-forme ressemble à MS-DOS et fait normalement CRLF à “\ n” traduction pour les fichiers texte, les couches par défaut sont:

unix crlf

Donc, le code ci-dessus devrait être redondant, mais c’est ce que vous demandez.

  • perlvar pour la variable $^O

  • ouvert pour le pragma ouvert.

  • si pour le chargement conditionnel des modules.