문제

O/S 의존적 인 테스트 스크립트의 일부를 작성하는 더 우아한 방법이 있습니까?

주석 줄 아래 코드를 참조하십시오.

배경: 기준 치수 perl :: 태그 VIM 용 태그 파일을 만듭니다. Win32에서 디렉토리 분리기는 ""이지만 다른 OS에서는 "/"입니다. 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');
}
도움이 되었습니까?

해결책

파일 :: 사양 그리고 경로 :: 클래스 이러한 종류의 플랫폼 특정 문제를 정확히 다루기 위해 만들어졌습니다.

다음은 당신이하려는 일입니까?

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

다른 팁

아마도 항상 Linux 스타일 슬래시를 사용할 수 있습니다.

NT와 UNIX에서 실행 해야하는 PERL 스크립트를 작성할 때 알아야 할 중요한 문제가 많이 있습니다. 우선, PathNames의 문제가 있습니다. DOS, Windows NT 및 Windows 95에서 백 슬래시 연산자가있는 PathNames를 지정하는 반면 UNIX에서는 전방 슬래시 연산자를 사용합니다. Win32 Perl 포트는 전방 슬래시 또는 백 슬래시를 허용합니다. PathNames에서 Forward Slashes를 사용하는 Perl 스크립트는 Backslashes를 사용하는 스크립트보다 휴대 가능성이 높습니다. 게다가, Perl 스크립트는 문자열에서 백 슬래시를 두 번 사용하여 Perl 통역사에서 백 슬래시 인스턴스를 피해야합니다. 드라이브 문자는 변경할 필요가 없습니다.

예를 들어, 다음 PathName은 다음 중 하나를 사용하여 설정할 수 있습니다.

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

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

(에서 Perl 5 해방)


항상 Linux 스타일을 사용할 수 없다고 확신하는 경우 CPAN 모듈을 사용해 볼 수 있습니다. 파일 :: 사양 또는 경로 :: 클래스. 을 체크하다 "Unix/Windows 경로 혼합을위한 CPAN 모듈"Perlmonks에 대한 토론 추가 정보.

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');

(비활성화) 패턴 metacharacters e

이자형 패턴 Metacharacters를 다시 비활성화하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top