Các chương trình con không đổi, tức là các chương trình con có mẫu thử rỗng và giá trị trả về không đổi, là nội dòng. Đó là cách số constant pragma xác định các hằng số:
sub five() { 5 }
sẽ được gạch chân nếu nó được nhìn thấy trước lần sử dụng đầu tiên.
Nếu không, Perl cho phép chương trình con được định nghĩa lại động trong thời gian chạy, do đó nội tuyến không phù hợp.
Đối với các chương trình con luôn trả về cùng một giá trị cho cùng một yếu tố đầu vào, bạn có thể sử dụng memoization.
Chapter 13 of Programming Perl cung cấp một số thông tin về các bước tối ưu hóa được thực hiện bởi perl
.
Điều này được gọi là xếp liên tục. Gấp liên tục không giới hạn trong các trường hợp đơn giản như chuyển 2 ** 10 thành 1024 vào thời gian biên dịch. Nó cũng giải quyết các cuộc gọi chức năng - cả các trình con con được xây dựng sẵn và được khai báo bởi người dùng, đáp ứng các tiêu chí từ phần "Nội tuyến các hàm liên tục" trong Chương 6, Chương trình con. Gợi nhớ kiến thức khét tiếng về trình biên dịch của FORTRAN về các chức năng nội tại của riêng mình, Perl cũng biết được cái nào được xây dựng riêng để gọi trong quá trình biên dịch. Đó là lý do tại sao nếu bạn cố gắng ghi nhật ký 0.0 hoặc sqrt của hằng số âm, bạn sẽ phải chịu một lỗi biên dịch, không phải lỗi thời gian chạy và trình thông dịch không bao giờ chạy.
Xem thêm perldoc perlguts.
Bạn có thể thấy ảnh hưởng của không đổi gấp cho mình:
#!/usr/bin/perl
use strict; use warnings;
sub log_ok() { 1 }
if (log_ok) {
warn "log ok\n";
}
perl -MO=Deparse t.pl
Output:
sub log_ok() { 1 }
use warnings;
use strict 'refs';
do {
warn "log ok\n"
};
t.pl syntax OK
Ở đây, gấp liên tục dẫn đến sự thay thế của khối if
với một khối do
vì trình biên dịch biết rằng log_ok
sẽ luôn trả về giá trị thực. Mặt khác, với:
#!/usr/bin/perl
use strict; use warnings;
sub log_ok() { 0.5 > rand }
if (log_ok) {
warn "log ok\n";
}
đầu ra Deparse:
sub log_ok() {
use warnings;
use strict 'refs';
0.5 > rand;
}
use warnings;
use strict 'refs';
if (log_ok) {
warn "log ok\n";
}
t.pl syntax OK
Một trình biên dịch C
có thể đã thay thế if (log_ok)
với if (0.5 > rand)
. perl
không làm điều đó.
Bạn vẫn nên thực hiện theo lời khuyên ngay cả khi cơ hội cho nội tuyến có vẻ có vẻ hạn chế hơn trong Perl. –