1

有没有更优雅的方法来编写依赖于 O/S 的测试脚本部分?

请参考注释行下方的代码。

背景:模块Perl::Tags为 VIM 创建一个标签文件。在 Win32 上,目录分隔符是“\”,但在其他操作系统上是“/”。Vim 的 Perl-support 模块似乎读标签文件很愉快,所以似乎不需要修改模块。

#!/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 解释器中转义一个反斜杠实例。驱动器号不必更改。

例如,可以使用以下任一方式设置以下路径名:

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

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

(来自Perl 5 Unleashed


如果您确定不能始终使用 Linux 样式,可以尝试使用 CPAN 模块File::SpecPath::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 的指导进行了修订——如果出现以下情况,则无需进行特定于操作系统的测试

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 回答