Что такое встроенные операторы / функции Perl? - PullRequest
14 голосов
/ 24 августа 2011

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

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

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

Ответы [ 4 ]

27 голосов
/ 24 августа 2011

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 и C ++), поэтому слово «функция» является неоднозначным.Эта неоднозначность, кажется, является основой вашего вопроса.


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

while (f()) { g() }

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

g() while f();
11 голосов
/ 24 августа 2011

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

__ FILE__, __LINE__, __PACKAGE__, __DATA__, __END__, AUTOLOAD, BEGIN, UNITCHECK, CORE, DESTROY, END, INIT, CHECK, abs, принять, аварийный сигнал и atan2, связать, связать,binmode, благословить, перерыв, вызывающий, chdir, chmod, chomp, chop, chown, chr, chroot, закрыть, closedir, cmp, подключиться, продолжить, потому что, crypt, dbmclose, dbmopen, по умолчанию, определено, удалить, умереть, сделать,dump, каждый, еще, elsif, endgrent, endhostent, endnetent, endprotoent, endpwent, endservent, eof, eq, eval, exec, существует, выход, exp, fcntl, fileno, flock, для, foreach, fork, format, formline,ge, getc, getgrent, getgrgid, getgrnam, gethostbyaddr, gethostbyname, gethostent, getlogin, getnetbyaddr, getnetbyname, getnetent, getpeername, getpgrp, getppid, getpriority, getprotobyname, getprotob, getp, getp getwentp, getpgetsockname, getsockopt, заданный, glob, gmtime, goto, grep, gt, hex, if, index, int, ioctl, join, ключи, kill, last, lc, lcfirst, le, длина, ссылка, listen, local, localtime, lock, log, lstat, lt, m, map, mkdir, msgctl, msgget, msgrcv, msgsnd, my, ne, следующий, нет, нет, oct, open, opendir или or ord, our,pack, package, pipe, pop, pos, print, printf, prototype, push, q, qq, qr, quotemeta, qw, qx, rand, read, readdir, readline, readlink, readpipe, recv, redo, ref, rename,требуется, сброс, возврат, обратный, перемотка назад, rindex, rmdir, скажем, скаляр, поиск, seekdir, выбор, semctl, semget, semop, отправка, setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent,setsockopt, shift, shmctl, shmget, shmread, shmwrite, shutdown, sin, сон, сокет, socketpair, сортировка, сплайс, split, sprintf, sqrt, srand, stat, состояние, исследование, sub, substr, символическая ссылка, syscall, sysopen,sysread, sysseek, система, syswrite, скажите, telldir, связать, связать, время, время, tr, усечь, uc, ucfirst, umask, undef, если, unlink, unpack, unshift, untie, пока, не использовать utime, значения,vec, wait, waitpid, wantarray, warn, когда, в то время как, напишите, x, xor, y.

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

1 голос
/ 24 августа 2011

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

#!/usr/bin/perl

use strict;
use warnings;

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

my $ref;

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

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

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

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

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

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

0 голосов
/ 24 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...