Подтвердить что ты не робот

Что такое встроенные операторы/функции Perl?

Я читаю "Начало Perl" Саймона Козенса и в главе 8 - Подпрограммы он утверждает, что "подпрограммы" являются пользовательскими функциями, а print, open, split и т.д. являются встроенными операторами или функциями.

Что это? Являются ли они действительно встроенными, встроенными в язык функциями (например, оператор C sizeof), или они, собственно, подпрограммы/функции модуля main?

Если они являются подпрограммами, это while, for, unless и т.д. также подпрограммы? Как насчет операторов вроде +, -, eq и т.д.?

4b9b3361

Ответ 1

print, open, split не являются подпрограммами. Они не приводят к подзаголовкам. Они даже не присутствуют в таблице символов (в main:: или в противном случае, хотя вы можете ссылаться на них как CORE::split и т.д.), И нельзя получить ссылку на их код (хотя выполняется работа по созданию прокси-подсистем для них в CORE::, если вы хотите рассматривать их как подпрограммы). Они являются операторами, как +.

$ 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

Они известны под разными названиями:

  • встроенные функции
  • Функции
  • встроенные команды
  • названные операторы

И большинство из них считается одним из следующих:

  • Оператор списка
  • названный унарный оператор

Подпрограммы часто называются функциями (как в C и С++), поэтому "функция" является двусмысленным словом. Эта двусмысленность, по-видимому, лежит в основе вашего вопроса.


Что касается while, for, unless и т.д., они являются ключевыми словами, используемыми "операторами управления потоком"

while (f()) { g() }

и "модификаторы операторов"

g() while f();

Ответ 2

Ключевыми словами Perl являются те, которые определены в файле regen/keywords.pl в дистрибутиве источника Perl. Это:

__ FILE__, __LINE__, __PACKAGE__, __DATA__, __END__, AUTOLOAD, BEGIN, UNITCHECK, CORE, DESTROY, END, INIT, CHECK, abs, accept, alarm, и, atan2, bind, binmode, благословение, перерыв, вызывающий, chdir, chmod, chomp, chop, chown, chr, chroot, close, closedir, cmp, connect, continue, cos, crypt, dbmclose, dbmopen, default, defined, delete, die, do, dump, each, else, elsif, endgrent, endhostent, endnetent, endprotoent, endpwent, endservent, eof, eq, eval, exec, существует, exit, exp, fcntl, fileno, flock, for, foreach, fork, format, formline, ge, getc, getgrent, getgrgid, getgrnam, gethostbyaddr, gethostbyname, gethostent, getlogin, getnetbyaddr, getnetbyname, getnetent, getpeername, getpgrp, getppid, getpriority, getprotobyname, getprotobynumber, getprotoent, getpwent, getpwnam, getpwuid, getervbyname, getservbyport, getservent, getsockname, getsockopt, заданный, glob, gmtime, goto, grep, gt, hex, if, index, int, ioctl, join, keys, kill, last, lc, lcfirst, le, length, link, listen, local, localtime, lock, log, lstat, lt, m, map, mkdir, msgctl, msgget, msgrcv, msgsnd, my, ne, next, no, not, oct, open, opendir, или, ord, наш, пакет, пакет, pipe, pop, pos, print, printf, prototype, push, q, qq, qr, quotemeta, qw, qx, rand, read, readdir, readline, readlink, readpipe, recv, redo, ref, rename, require, reset, return, реверс, переиндир, rindex, rmdir, s, скажем, скаляр, поиск, поиск, select, semctl, semget, semop, send, setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setervent, 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, if, unlink, unpack, unshift, unie, until, use, utime, values, vec, wait, waitpid, wantarray, warn, when, while, write, x, xor, y.

Требуется чтение perlsyn, perlop и perlsub, а затем, возможно, с помощью man-страницы perlfunc. Чтобы узнать, как переопределить встроенные операторы, используемые с объектами, см. Справочную страницу перегрузки.

Ответ 3

Встроенные операторы не являются подпрограммами Perl. Например,

#!/usr/bin/perl

use strict;
use warnings;

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

my $ref;

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

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

Первый $ref->(); - косвенный вызов; он печатает "В foo".

Второй выводит предупреждение:

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

потому что print не является именем подпрограммы.

Ответ 4

Просто подумайте о "встроенных функциях" как о функциях, которые вы не создали. Легко ли?: -)