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:
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.