Frage

Gibt es eine elegantere Weise den Teil des Testskripts zu schreiben, die O / S abhängig?

Bitte beachten Sie den Code unter der Kommentarzeile.

Hintergrund: Modul Perl :: Stichworte erstellt eine Datei-Tags für VIM. Auf Win32 ist das Verzeichnis Separator „\“, aber auf anderen Betriebssystemen ist es „/“. Vims Perl-Support-Modul scheint die Tags-Datei ganz glücklich zu lesen, so scheint es keine Notwendigkeit, das Modul zu ändern.

#!/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');
}
War es hilfreich?

Lösung

File :: Spec und Pfad :: Class gebaut wurden genau diese Art von Plattform-spezifische Probleme zu lösen.

Ist das folgende, was Sie zu tun versuchen?

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

Andere Tipps

Vielleicht können Sie einfach immer die Schrägstriche Linux-Stil verwenden, weil:

  

Es gibt viele wichtige Punkte, die Sie bewusst sein müssen, wenn Perl-Skripte zu schreiben, die unter NT und UNIX ausgeführt werden müssen. Zunächst einmal gibt es die Frage der Pfadnamen. In DOS, Windows NT und Windows 95 Sie Pfadnamen mit einem Backslash Operator angeben, während in UNIX Sie den Schrägstrich-Operator verwenden. Die Win32-Perl-Port können entweder nach vorne oder Schrägstriche Schrägstriche. Ein Perl-Skript mit Slashes in Pfadnamen wahrscheinlicher ist, ein Skript tragbar zu sein als die Verwendung von umgekehrten Schrägstrichen. Abgesehen davon, wird Perl-Skripte den Backslash zweimal in Zeichenketten verwenden, eine Instanz eines umgekehrten Schrägstrich aus dem Perl-Interpreter zu entkommen. Laufwerksbuchstaben müssen nicht geändert werden.

     

Zum Beispiel kann der folgende Pfad verwendet werden, setzen eine der folgenden:

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

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

(von Perl 5 Unleashed )


Wenn Sie sicher sind, dass Sie nicht immer den Stil Linux verwenden können, können Sie versuchen, die CPAN-Module mit File :: Spec oder Pfad :: Class . Schauen Sie sich die „CPAN Modul zum Mischen von Unix / Windows-Pfad“ Diskussion über PerlMonks für zusätzliche Informationen.

überarbeitete folgende Anleitung von Sinan Unur - es gibt keine Notwendigkeit, betriebssystemspezifische Tests, wenn

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

wird ersetzt mit

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

\ Q (deaktivieren) Muster Metazeichen bis \ E

\ E deaktivieren Muster Metazeichen wieder

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top