1

O/S に依存するテスト スクリプトの部分を記述するよりエレガントな方法はありますか?

コメント行の下のコードを参照してください。

背景:モジュールPerl::Tagsは、VIM のタグ ファイルを作成します。Win32 ではディレクトリ セパレータは「\」ですが、他の OS では「/」です。Vim の Perl サポート モジュールは、タグ ファイルを非常に問題なく読み取るように見えるので、モジュールを変更する必要はないようです。

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

3 に答える 3

3

たぶん、あなたはいつでもLinuxスタイルのスラッシュを使うことができます。理由は次のとおりです。

NTおよびUNIXで実行する必要のあるPerlスクリプトを作成する場合は、注意しなければならない重要な問題がたくさんあります。まず、パス名の問題があります。DOS、Windows NT、およびWindows 95では、バックスラッシュ演算子を使用してパス名を指定しますが、UNIXでは、スラッシュ演算子を使用します。Win32 Perlポートでは、スラッシュまたはバックスラッシュのいずれかを使用できます。パス名にスラッシュを使用するPerlスクリプトは、バックスラッシュを使用するスクリプトよりも移植性が高い可能性があります。さらに、Perlスクリプトは、Perlインタープリターからバックスラッシュの1つのインスタンスをエスケープするために、文字列でバックスラッシュを2回使用する必要があります。ドライブ文字を変更する必要はありません。

たとえば、次のパス名は、次のいずれかを使用して設定できます。

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

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

Perl 5 Unleashedから)


Linuxスタイルを常に使用できるとは限らない場合は、CPANモジュールのFile::SpecまたはPath::Classを使用してみてください。詳細については、Perlmonksの「Unix/Windowsパスを混合するためのCPANモジュール」の説明を確認してください。

于 2009-10-26T11:35:19.947 に答える
3

File::SpecPath::Classは、まさにこれらの種類のプラットフォーム固有の問題に対処するために構築されました。

次はあなたがやろうとしていることですか?

#!/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',
);
于 2009-10-26T11:41:17.117 に答える
0

SinanÜnürからのガイダンスに従って改訂-次の場合はOS固有のテストを行う必要はありません

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

に置き換えられます

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

\ Q(無効)\Eまでのパターンメタ文字

\Eパターンメタ文字を再度無効にする

于 2009-10-26T12:59:27.063 に答える