2011-08-23 41 views
14

Tôi đang đọc Beginning Perl bởi Simon Cozens và trong Chương 8 - Subroutines ông nói rằng "thủ tục con" là chức năng người dùng, trong khi print, open, split, vv được xây dựng trong các nhà khai thác hoặc các chức năng.Các toán tử/chức năng dựng sẵn của Perl là gì?

Chúng là gì? Chúng có thực sự được xây dựng trong, các tính năng nội tại-ngôn ngữ (giống như toán tử sizeof của C) hay thực tế là các chương trình con/chức năng của mô-đun main?

Nếu chúng là các chương trình con, là while, for, unless, v.v ... cũng là chương trình con? Còn các nhà khai thác như +, -, eq, v.v ... thì sao?

+3

Tôi sẽ xem 'perldoc perlfunc' và 'perldoc -f '. –

+1

Đây là danh sách yêu thích của tôi về các toán tử perl: http://www.ozonehouse.com/mark/periodic/ – Seth

+1

@Seth Đó là cho Perl 6, mà (cho tất cả các ý định và mục đích) là một ngôn ngữ hoàn toàn riêng biệt từ Perl 5, là những gì chỉ là về tất cả mọi người có nghĩa là khi họ nói "Perl." – jwodder

Trả lời

25

print, open, split không phải là chương trình con. Chúng không dẫn đến các cuộc gọi phụ. Họ thậm chí không có mặt trong bảng biểu tượng (trong main:: hoặc cách khác, mặc dù bạn có thể tham chiếu chúng là CORE::split, v.v.) và không thể tham chiếu đến mã của chúng (mặc dù công việc đang được thực hiện để tạo proxy cho chúng trong CORE:: khi bạn muốn đối xử với họ như là chương trình con). Chúng là các toán tử giống như +.

$ perl -MO=Concise,-exec -e'sub f {} f()' 
1 <0> enter 
2 <;> nextstate(main 2 -e:1) v:{ 
3 <0> pushmark s 
4 <#> gv[*f] s 
5 <1> entersub[t3] vKS/TARG,1  <--- sub call 
6 <@> leave[1 ref] vKP/REFC 
-e syntax OK 

$ perl -MO=Concise,-exec -e'split /;/' 
1 <0> enter 
2 <;> nextstate(main 1 -e:1) v:{ 
3 </> pushre(/";"/) s/64 
4 <#> gvsv[*_] s 
5 <$> const[IV 0] s 
6 <@> split[t2] vK     <--- not a sub call 
7 <@> leave[1 ref] vKP/REFC 
-e syntax OK 

$ perl -MO=Concise,-exec -e'$x + $y' 
1 <0> enter 
2 <;> nextstate(main 1 -e:1) v:{ 
3 <#> gvsv[*x] s 
4 <#> gvsv[*y] s 
5 <2> add[t3] vK/2     <--- Just like this 
6 <@> leave[1 ref] vKP/REFC 
-e syntax OK 

Họ được gọi bằng nhiều tên khác nhau:

  • chức năng được xây dựng trong
  • chức năng
  • builtins
  • tên nhà khai thác

Và hầu hết được coi là một của những điều sau đây:

  • hành danh sách
  • tên nhà điều hành unary

Subroutines thường được gọi là chức năng (như họ đang có trong C và C++), do đó "chức năng" là một từ mơ hồ. Sự mơ hồ này dường như là nền tảng cho câu hỏi của bạn.


Đối với while, for, unless, vv, họ là các từ khóa được sử dụng bởi "báo cáo kiểm soát dòng chảy"

while (f()) { g() } 

và "bổ tuyên bố"

g() while f(); 
+1

Mã bạn đã đăng mã mà VM của Perl hiểu, được tạo bởi trình thông dịch perl chưa? – Raphael

+0

@Raphael, Có, Chúng là các biểu diễn của các cây opcode do các chương trình biên dịch. – ikegami

10

Từ khóa Perl là những từ khóa được xác định trong tệp regen/keywords.pl trong phân phối nguồn Perl. Đó là:

__FILE__, __LINE__, __PACKAGE__, __DATA__, __END__, Autoload, BEGIN, UNITCHECK, CORE, DESTROY, END, INIT, KIỂM TRA, abs, chấp nhận, báo thức, và atan2, ràng buộc, binmode , chúc lành, nghỉ ngơi, người gọi, chdir, chmod, chomp, cắt, chown, chr, chroot, đóng, đóng, cmp, kết nối, tiếp tục, cos, crypt, dbmclose, dbmopen, mặc định, được xác định, xóa, chết, làm, đổ, mỗi, khác, elsif, endgrent, endhostent, endnetent, endprotoent, endpwent, endervent, eof, eq, eval, exec, tồn tại, thoát, exp, fcntl, fileno, bầy, cho, foreach, fork, định dạng, formline, ge, getc, getgrent, getgr gid, getgrnam, gethostbyaddr, GetHostByName, gethostent, getlogin, getnetbyaddr, getnetbyname, getnetent, getpeername, getpgrp, getppid, getpriority, getprotobyname, getprotobynumber, getprotoent, getpwent, getpwnam, getpwuid, getservbyname, getservbyport, getservent, getsockname, getockopt, được cung cấp, glob, gmtime, goto, grep, gt, hex, if, index, int, ioctl, kết nối, khóa, diệt, cuối cùng, lc, lcfirst, le, length, link, nghe, giờ địa phương , khóa, đăng nhập, lstat, lt, m, bản đồ, mkdir, msgctl, msgget, msgrcv, msgsnd, my, ne, next, no, not, oct, open, opendir, hoặc, ord, gói, gói của chúng tôi , ống, pop, pos, print, printf, nguyên mẫu, đẩy, q, qq, qr, quotemeta, qw, qx, rand, read, readdir, readline, readlink, readpipe, recv, redo, ref, đổi tên, yêu cầu, đặt lại, quay lại, đảo ngược, rewinddir, rindex, rmdir, s, nói, vô hướng, tìm kiếm, tìm kiếm, chọn, semctl, semget, semop, send , setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent, setsockopt, shift, shmctl, shmget, shmread, shmwrite, shutdown, sin, sleep, socket, socketpair, sort, splice, split, sprintf, sqrt, srand, stat, state, study, sub, substr, symlink, syscall, sysopen, sysread, sysseek, system, syswrite, tell, telldir, tie, tied, time, times, tr, truncate, uc, ucfirst , umask, undef, trừ khi, hủy liên kết, giải nén, unshift, untie, cho đến khi, sử dụng, utime, values, vec, wait, waitpid, wantarray, cảnh báo, khi nào, trong khi, viết, x, xor, y.

Các perlsyn, perlop, và perlsub manpages được yêu cầu đọc, sau đó có lẽ bởi perlfunc manpage. Để tìm hiểu cách ghi đè toán tử nội trang được sử dụng với đối tượng, hãy xem trang web quá tải.

+0

Không bao giờ thấy một ngôn ngữ có nhiều từ khóa! – Raphael

+0

@Raphael: Sau đó, không nhìn vào COBOL. ;) – musiKk

+3

@Raphael: Có thể bạn đang nghĩ đến từ khóa là một thứ không thể ghi đè, như 'if' và' trừ'. ** Perl có * rất ít * những từ khóa hoàn toàn bất biến ** Hầu hết từ khóa của Perl từ 'regen/keywords.pl' có thể thực sự được ghi đè thông qua một (hoặc nhiều hơn) trong ba cách: bằng cách nhập một hàm của tên đó từ một gói khác (như trong 'chdir' hoặc' open') hoặc khác thông qua việc buộc (như trong 'keys' hoặc' pop') hoặc quá tải toán tử (như trong 'print',' cmp', hoặc 'qq'). Cái nào đòi hỏi kinh nghiệm với ngôn ngữ để hiểu. – tchrist

1

Việc xây dựng trong các toán tử không phải là các chương trình con Perl. Ví dụ:

#!/usr/bin/perl 

use strict; 
use warnings; 

sub Foo { print "In foo\n"; } 

my $ref; 

$ref = \&Foo; 
$ref->(); 

$ref = \&print; 
$ref->(); 

Đầu tiên $ref->(); là cuộc gọi gián tiếp; nó in "Trong foo".

thứ hai tạo ra một cảnh báo:

Undefined subroutine &main::print called at ./tmp.pl line 14 

print không phải là tên của một chương trình con.

+1

fyi, '\ & CORE :: builtin' đang được thêm vào 5.16. Nó sẽ tự động hóa một phụ gọi là nội trang. – ikegami

0

Đơn giản chỉ cần nghĩ về "chức năng tích hợp" làm chức năng mà bạn không tạo. Dễ dàng phải không? :-)

+6

Ngoại trừ bạn không thể tham chiếu đến chúng. Ngoại trừ bạn không thể ghi đè nguyên mẫu phân tích cú pháp và quy tắc phân tích đặc biệt của chúng bằng cách bắt đầu cuộc gọi bằng '&'. Ngoại trừ bạn không thể 'goto' chúng. (và tôi chắc chắn tôi đang thiếu một số) – ikegami

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