Pregunta

¿Existe una forma más elegante de escribir la parte del script de prueba que depende de O / S?

Consulte el código debajo de la línea de comentarios.

Fondo: Módulo Perl :: Etiquetas crea un archivo de etiquetas para VIM. En Win32, el separador de directorio es " \ " pero en otros sistemas operativos es " / " ;. El módulo de soporte de Perl de Vim parece leer el archivo de etiquetas muy felizmente, por lo que parece que no hay necesidad de modificar el 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');
}
¿Fue útil?

Solución

File :: Spec y Path :: Class se crearon para abordar exactamente este tipo de problemas específicos de la plataforma.

¿Lo que intentas hacer es lo siguiente?

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

Otros consejos

Tal vez simplemente puedas usar las barras diagonales del estilo de Linux, porque:

  

Hay muchos problemas importantes que debe tener en cuenta al escribir scripts de Perl que deben ejecutarse en NT y UNIX. En primer lugar, está el tema de las rutas de acceso. En DOS, Windows NT y Windows 95 usted especifica las rutas de acceso con un operador de barra invertida, mientras que en UNIX usa el operador de barra diagonal. El puerto Perl de Win32 permite barras diagonales o barras invertidas. Es más probable que una secuencia de comandos Perl que usa barras inclinadas en las rutas de acceso sea portátil que una secuencia de comandos que usa barras diagonales inversas. Además de eso, los scripts de Perl tendrán que usar la barra invertida dos veces en cadenas para escapar de una instancia de una barra invertida del intérprete de Perl. Las letras de unidad no tienen que cambiar.

     

Por ejemplo, la siguiente ruta de acceso se puede establecer usando una de las siguientes opciones:

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

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

(de Perl 5 Unleashed )


En caso de que esté seguro de que no siempre puede usar el estilo de Linux, puede intentar usar los módulos CPAN File :: Spec o Path :: Class . Consulte el " Módulo CPAN para mezclar la ruta de Unix / Windows " discusión sobre Perlmonks para obtener información adicional.

Revisado siguiendo la guía de Sinan & # 220; n & # 252; r: no es necesario realizar pruebas específicas del sistema operativo si

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

se reemplaza con

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

\Q (deshabilitar) metacaracteres de patrón hasta \ E

\E deshabilite nuevamente los metacaracteres del patrón

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top