Question

Existe-t-il un moyen plus élégant d'écrire la partie du script de test qui dépend du système d'exploitation?

Veuillez vous reporter au code situé sous la ligne de commentaire.

Contexte : le module Perl :: Tags crée un fichier de balises pour VIM. Sous Win32, le séparateur de répertoires est " \ " mais sur d'autres OS, il s'agit de "/". Le module de support Perl de Vim semble lire le fichier de balises très facilement, il semble donc inutile de modifier le module.

#!/usr/bin/perl -w
use strict; use warnings;
use Data::Dumper;

use Test::More tests => 6;
use FindBin qw($Bin);

BEGIN {
  use_ok( 'Perl::Tags' );
}

my $naive_tagger = Perl::Tags::Naive->new( max_level=>1 );
ok (defined $naive_tagger, 'created Perl::Tags' );
isa_ok ($naive_tagger, 'Perl::Tags::Naive' );
isa_ok ($naive_tagger, 'Perl::Tags' );

my $result = 
    $naive_tagger->process(
        files => [ "$Bin/Test.pm" ],
        refresh=> 1
    );
ok ($result, 'processed successfully' ) or diag "RESULT $result";

# Other tests also fail because \Test.pm on Win32 vs /Test.pm on Linux/ OS X
if ( $^O =~ /MSWin32/ ) {
    like ($naive_tagger, qr{Test\t\S+\\Test.pm\t/package Test;/}       , 'package line');
} else {
    like ($naive_tagger, qr{Test\t\S+/Test.pm\t/package Test;/}       , 'package line');
}
Était-ce utile?

La solution

Fichier :: Spec et Path :: Class ont été conçus pour traiter exactement ce type de problèmes spécifiques à la plate-forme.

Les éléments suivants sont-ils ce que vous essayez de faire?

#!/usr/bin/perl
use strict; use warnings;

use Test::More tests => 6;
use FindBin qw($Bin);
use File::Spec::Functions qw(catfile catpath rootdir);

BEGIN {
  use_ok( 'Perl::Tags' );
}

my $naive_tagger = Perl::Tags::Naive->new(max_level => 1);
ok (defined $naive_tagger, 'created Perl::Tags');
isa_ok ($naive_tagger, 'Perl::Tags::Naive');
isa_ok ($naive_tagger, 'Perl::Tags');

my $result = 
    $naive_tagger->process(
        files => [ catfile($Bin, 'Test.pm') ],
        refresh => 1
    );
ok ($result, 'processed successfully' ) or diag "RESULT $result";

my $file = catfile(rootdir, 'Test.pm');
# or $file = catpath('C:', rootdir(), 'Test.pm')
# depending on what you mean.

like($naive_tagger
    qr{Test\t\S+\Q$file\E\t/package Test;/}, 
    'package line',
);

Autres conseils

Peut-être pouvez-vous simplement simplement utiliser les barres obliques de style Linux, car:

  

Il faut tenir compte de nombreux problèmes importants lors de l'écriture de scripts Perl devant s'exécuter sous NT et UNIX. Tout d’abord, il y a la question des noms de chemin. Sous DOS, Windows NT et Windows 95, vous spécifiez des noms de chemin avec un opérateur de barre oblique inversée, tandis que sous UNIX, vous utilisez l'opérateur de barre oblique. Le port Win32 Perl autorise les barres obliques ou les barres obliques inverses. Un script Perl utilisant des barres obliques dans les noms de chemins a plus de chances d'être portable qu'un script utilisant des barres obliques inverses. En outre, les scripts Perl devront utiliser la barre oblique inverse deux fois dans les chaînes pour échapper à une occurrence d'une barre oblique inverse de l'interpréteur Perl. Les lettres de lecteur ne doivent pas changer.

     

Par exemple, le chemin suivant peut être défini à l'aide de l'un des éléments suivants:

$myFile = "E:/users/default/datafile.txt";

$myFile = "E:\\users\\default\\datafile.txt";

(extrait de Perl 5 Unleashed )

Si vous êtes certain de ne pas toujours utiliser le style Linux, vous pouvez utiliser les modules CPAN Fichier :: Spec ou Chemin :: Classe . Consultez le " module CPAN permettant de mélanger le chemin d'accès Unix / Windows " discussion sur Perlmonks pour plus d’informations.

Révision des instructions suivantes de Sinan & # 220; n & # 252; r - il n'est pas nécessaire de faire des tests spécifiques au système d'exploitation si

like ($naive_tagger, qr{Test\t\S\Test.pm\t/package Test;/}       , 'package line');

est remplacé par

like ($naive_tagger, qr{Test\t\S+\QTest.pm\E\t/package Test;/}       , 'package line');

\ Q (désactiver) les métacaractères du modèle jusqu'à \ E

\ E désactiver à nouveau les métacaractères du modèle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top