Domanda

Esiste un modo più elegante per scrivere la parte dello script di test che dipende da O / S?

Fare riferimento al codice sotto la riga dei commenti.

Sfondo: il modulo Perl :: Tag crea un file di tag per VIM. Su Win32 il separatore di directory è " \ " ma su altri sistemi operativi è " / " ;. Il modulo di supporto Perl di Vim sembra leggere il file dei tag abbastanza felicemente, quindi sembra che non sia necessario modificare il modulo.

#!/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');
}
È stato utile?

Soluzione

File :: Spec e Path :: Class sono stati creati per affrontare esattamente questo tipo di problemi specifici della piattaforma.

È ciò che stai cercando di fare?

#!/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',
);

Altri suggerimenti

Forse puoi semplicemente usare sempre le barre di stile Linux, perché:

  

Ci sono molti problemi importanti che devi conoscere quando scrivi gli script Perl che devono essere eseguiti in NT e UNIX. Prima di tutto, c'è il problema dei nomi dei percorsi. In DOS, Windows NT e Windows 95 si specificano i percorsi con un operatore barra rovesciata, mentre in UNIX si utilizza l'operatore barra rovesciata. La porta Perl Win32 consente sia barre rovesciate che barre rovesciate. Uno script Perl che utilizza barre rovesciate nei nomi dei percorsi ha maggiori probabilità di essere portatile rispetto a uno script che utilizza barre rovesciate. Oltre a ciò, gli script Perl dovranno usare la barra rovesciata due volte nelle stringhe per sfuggire a un'istanza di una barra rovesciata dall'interprete Perl. Le lettere di unità non devono cambiare.

     

Ad esempio, il seguente percorso può essere impostato utilizzando uno dei seguenti:

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

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

(da Perl 5 Unleashed )


Se sei sicuro di non poter sempre usare lo stile Linux, puoi provare a usare i moduli CPAN File :: Spec o Path :: Class . Controlla il " modulo CPAN per la miscelazione del percorso Unix / Windows " discussione su Perlmonks per ulteriori informazioni.

Revisionato seguendo le indicazioni di Sinan Ünür - se non è necessario eseguire test specifici del sistema operativo

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

è sostituito con

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

\Q (disabilita) pattern metacaratteri fino a \ E

\E disabilita nuovamente i metacaratteri di pattern

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top