Pergunta

Existe uma maneira mais elegante de escrever a parte do script de teste que é O / S dependente?

Por favor, consulte o código abaixo da linha de comentário.

Fundo: módulo Perl :: tags cria um arquivo de tags para VIM. Em Win32 o separador de diretório é "\", mas em outro sistema operacional é que é "/". módulo Perl-suporte do Vim parece ler o arquivo de tags muito feliz, então não parece haver necessidade de modificar o módulo.

#!/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');
}
Foi útil?

Solução

File :: Spec e Path :: Class foram construídos para o endereço exatamente estes tipos de questões plataforma específicos.

É o seguinte o que você está tentando fazer?

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

Outras dicas

Talvez você pode simplesmente usar sempre as barras de estilo Linux, porque:

Há muitas questões importantes que você deve estar ciente de quando escrever scripts Perl que devem ser executados sob NT e UNIX. Em primeiro lugar, há a questão dos caminhos. Em DOS, Windows NT e Windows 95 você especificar caminhos com um operador de barra invertida, enquanto que em UNIX você usar o operador barra. A porta Win32 Perl permite barras para a frente ou invertidas. Um script Perl utilizando barras em caminhos é mais provável que seja portátil do que um script usando barras invertidas. Além disso, scripts Perl terá que usar a barra invertida duas vezes em cordas para escapar uma instância de uma barra invertida do interpretador Perl. letras de unidade não tem que mudar.

Por exemplo, o seguinte caminho pode ser definido usando um dos seguintes procedimentos:

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

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

(a partir de Perl 5 desencadeada )


No caso que você tem certeza de que você não pode sempre usar o estilo Linux, você pode tentar usar os módulos do CPAN File :: Spec ou Path :: Class . Verifique a "Módulo CPAN para misturar caminho Unix / Windows" discussão sobre PerlMonks para informações adicionais.

revisto após a orientação de Sinan Ünür - não há necessidade de fazer testes específicos OS Se

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

é substituído por

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

\ Q metacharacters (desativar) padrão até \ E

\ E metacharacters disable padrão novamente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top