2010-10-09 40 views
12

Tôi đang sử dụng Eclipse kết hợp với EPIC để viết mã Perl của mình. Tôi đã định cấu hình EPIC để sử dụng Perltidy với kiểu "-pbp" (perl best practices) để định dạng mã của mình.Làm thế nào tôi có thể thực hiện công việc perltidy với Phương pháp :: Chữ ký?

Tính năng này không hoạt động tốt khi sử dụng Method::Signatures 'named parameters. Ví dụ: func (:$arg1, : $arg2) được định dạng là func (: $arg1, : $arg2) mang lại lỗi.

Ngoài ra, func từ khóa không được công nhận như sub do đó thụt lề là sai.

Liên quan đến this câu hỏi chưa được trả lời trước đó và this bài đăng chéo.

Trả lời

2

Bạn không thể, trừ khi bạn thực hiện PPI, đó là những gì Perltidy sử dụng cho hầu hết công việc của mình, nhận biết các mô-đun chữ ký khác nhau như MooseX::Method::Signatures, Method::Signatures::Simple hoặc Method::Signatures.

Giải pháp hợp lý có thể là không chạy Perltidy trên tất cả mã của bạn, nhưng chỉ trên các phần của mã bạn vừa mới viết và muốn định dạng theo một cách nào đó. Bằng cách đó bạn có thể dễ dàng bỏ qua việc chạy nó trên bất kỳ chữ ký phương thức nào và nó chỉ xử lý các phương thức của phương thức thay thế.

+0

Tôi rất quen với 'Alt + Ctrl + F' (tự động sửa tất cả) và thích nó. Tôi sẽ rất buồn khi từ bỏ nó. –

+1

Vì vậy, tôi có thể thấy 1) tự động định dạng/tất cả/mã của bạn mà không xem xét, 2) từ bỏ các phần của chữ ký phương thức, hoặc 3) thực hiện một số công việc trên PPI . Lựa chọn của bạn. – rafl

+3

perltidy KHÔNG sử dụng PPI - nó có trình phân tích cú pháp riêng của nó –

3

Perl :: Tidy/perltidy không tận dụng PPI, nó xảy ra trước PPI khoảng 9 năm ( http://sourceforge.net/projects/perltidy/ nói đã đăng ký: 2000/12/23)

+2

http://search.cpan.org/dist/Perl-Tidy/META.yml chứng minh rằng bản phát hành hiện tại cũng không di chuyển sang PPI. – daxim

4

Bạn có thể thay đổi kịch bản perlcritic với trước và bộ lọc bài đăng. Các changelog cung cấp các ví dụ sau

Perl::Tidy::perltidy(
    prefilter => sub { $_ = $_[0]; s/^method (.*)/sub $1 \#__METHOD/gm; return $_ }, 
    postfilter => sub { $_ = $_[0]; s/^sub (.*?)\s* \#__METHOD/method $1/gm; return $_ } 
); 

Perlcritic bây giờ sẽ đối xử với method như một sub cho các mục đích của định dạng. Chúng tôi có thể làm tương tự với func. Tôi đã sửa đổi của tôi/usr/local/bin/perlcritic để làm việc với func như sau:

#!/usr/bin/perl 

eval 'exec /usr/bin/perl -S $0 ${1+"[email protected]"}' 
    if 0; # not running under some shell 
package main; 

use Perl::Tidy; 

my $arg_string = undef; 

# give Macs a chance to provide command line parameters 
if ($^O =~ /Mac/) { 
    $arg_string = 
     MacPerl::Ask('Please enter @ARGV (-h for help)', 
     defined $ARGV[0] ? "\"$ARGV[0]\"" : ""); 
} 

Perl::Tidy::perltidy(
    argv => $arg_string, 
    prefilter => sub { $_ = $_[0]; s/\W\Kfunc\((.*)/sub($1 \#__FUNC/gm; return $_ }, 
    postfilter => sub { $_ = $_[0]; s/\W\Ksub\((.*?)\s* \#__FUNC/func($1/gm; return $_ } 
); 
+0

Điều này sửa lỗi từ khóa phương pháp. Xem PerlTidy này [subclass] (http://www.openswartz.com/2010/12/19/perltidy-and-method-happy-together/) để khắc phục vấn đề chữ ký của phương thức mà OP được đánh dấu. –

1

Trong khi đó một module mới tồn tại trên CPAN mà giải quyết vấn đề này. Được gọi là Perl::Tidy::Sweetened và cung cấp tập lệnh perltidier.

Nó cũng sử dụng các móc prefilterpostfilter của Perl::Tidy, nhưng bạn không cần phải tự lo về điều đó.

Các vấn đề liên quan