Làm thế nào để sử dụng Saba từ Perl

Nhiệm vụ. Đó là một kịch bản trong ngôn ngữ Perl. Nó xác định một vài chức năng (Saba). Bạn cần phải Taipalsaari này hoạt động trong một kịch bản khác.

Đây là một ví dụ. Đó là một kịch bản script.pl xác định Saba header. Này Saba rất nhanh chuỗi, và nó trở về chuỗi này trong một sự giảm giá đầu. Trong kịch bản này này Saba máy hai tiêu đề:

▶ Run
#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

say header('one');
say header('two');

Chạy perl script.pl thấy trên màn hình:

## ONE
## TWO

Nhiệm vụ là tạo ra một kịch bản khác other.pl mà cũng sẽ sử dụng Saba.

Các giải pháp — sao chép-dán

Các đơn giản (nhưng xấu) giải pháp là sao chép mã tàu ngầm trong một kịch bản khác. Đây là giải pháp thu được đây là một other.pl:

#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

say header('three');

Bây giờ bạn có thể chạy kịch bản này perl other.pl và xem trên màn hình, các văn bản ## THREE.

Điều này giải pháp cho các vấn đề, nhưng đây là một quyết định xấu. Do thực tế là cùng một mã trong một số các tập tin nó trở nên khó khăn để làm việc với mã như vậy. Khi bạn cần phải thay đổi này Saba, sau đó phải thay đổi nó trong một vài nơi (và vẫn phải nhớ để thay đổi mã số ở tất cả các tập tin ngay).

Giải pháp là để đưa Saba trong một tách module

Các giải pháp chính xác là để làm cho một Saba trong một mô-đun riêng biệt. Cho này tạo ra một tập tin lib/Utils.pm:

package Utils;

use strict;
use warnings;

use Exporter;

our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
    header
);
our @EXPORT = @EXPORT_OK;

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

1;
  • package Utils; - thông báo rằng nó "thư viện" Utils
  • use strict;use warnings; — chuyển sang chế độ để Perl đã đòi hỏi nhiều hơn của tốt mã
  • 5 đường về EXPORT cho thấy rằng khi bạn kết nối mà thư viện cần đến chức năng header là có
  • chuyển năng
  • 1; — gói nên kết thúc với sự thật

Sau này mô tả của các chức năng bạn cần từ các kịch bản script.pl để dọn dẹp, nhưng thêm kết nối thư viện:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('one');
say header('two');

Sau đó bạn có thể chạy này giống kịch bản, sử dụng sự chỉ huy perl -Ilib/ script.pl. Trong các dòng lệnh -I vượt qua giá trị lib/ — mục nơi sẽ Perl tìm cho thư viện. Các kết quả của kịch bản này là chính xác cùng một như trước.

Và bây giờ hoàn toàn tầm thường để Taipalsaari cùng Saba trong một kịch bản khác. Viết kịch bản other.pl, đó là gần giống như script.pl:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('three');

Chạy kịch bản này perl -Ilib/ other.pl thấy trên màn hình ## THREE.

Giải pháp kết nối kịch bản mã để kịch bản

Đó là một giải pháp khác, bạn có thể sử dụng các Saba được xác định trong kịch bản script.pl để Taipalsaari trong kịch bản other.pl. Để làm được điều này, viết văn bản này như một tập tin other.pl:

#!/usr/bin/perl

use feature qw(say);

require './script.pl';

say header('three');

Chạy kịch bản perl other.pl (tập tin other.pl phải ở cùng một mục như kịch bản script.pl). Kết quả:

## ONE
## TWO
## THREE

Vì vậy, khi bạn chạy kịch bản other.pl lần đầu tiên thực hiện tất cả các mã mà được script.pl (dòng ## ONE## TWO), và chỉ sau đó chạy mã từ một kịch bản other.pl (dòng ## THREE).

Để khi bạn chạy kịch bản other.pl đã không được thực hiện phần script.pl , chúng ta cần một chút thay đổi script.pl. Bạn cần phải quấn toàn bộ mã trong kịch bản thân dưới những điều kiện để viết ở cuối của kịch bản đơn vị như một giá trị thực sự:

#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

if ( not caller() ) {
    say header('one');
    say header('two');
}

1;

Bây giờ nếu chúng ta chạy perl script.pl, chúng tôi có được chính xác cùng một đầu ra như trước, và nếu bạn bắt đầu perl other.pl, sau đó ra sẽ được chỉ mong muốn văn bản ## THREE.

Từ khóa caller trả một giá trị khác nhau tùy thuộc vào cách bạn bắt đầu kịch bản. Tính năng này chúng tôi sử dụng ở đây để chia tách một chạy kịch bản trực tiếp các kết nối kịch bản, sử dụng require.

Các bài viết khác