2011-08-23 19 views
14

estoy leyendo Beginning Perl por Simon Cozens y en Capítulo 8 - Las subrutinas afirma que "subrutinas" son funciones de usuario, mientras que print, open, split, etc., están incorporados en los operadores o funciones.¿Qué son los operadores/funciones integradas de Perl?

¿Qué son? ¿Están realmente integradas, características intrínsecas del lenguaje (como el operador de C sizeof) o son, en realidad, subrutinas/funciones del módulo main?

Si son subrutinas, son while, for, unless, etc. ¿también subrutinas? ¿Y los operadores como +, -, eq, etc.?

+3

Me gustaría ver 'perldoc perlfunc' y' perldoc -f '. –

+1

Esta es mi lista favorita de operadores de Perl: http://www.ozonehouse.com/mark/periodic/ – Seth

+1

@Seth Eso es para Perl 6, que (para todos los efectos) es un lenguaje completamente separado de Perl 5, que es lo que todo el mundo quiere decir cuando dicen "Perl". – jwodder

Respuesta

25

print, open, split no son subrutinas. No resultan en llamadas secundarias. Ni siquiera están presentes en la tabla de símbolos (en main:: o de lo contrario, aunque puede referirse a ellos como CORE::split, etc.), y no se puede obtener una referencia a su código (aunque se está trabajando para crear subs proxy para ellos en CORE:: para cuando quiera tratarlos como subrutinas). Son operadores al igual que +.

$ 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 

Se les conoce por una variedad de nombres:

  • funciones incorporadas
  • funciones
  • órdenes internas
  • operadores nombrados

y la mayoría son considerado como uno de los siguientes:

  • lista de operadores
  • nombrado operador unitario

subrutinas se llaman a menudo funciones (como en C y C++), por lo que la "función" es una palabra ambigua. Esta ambigüedad parece ser la base de su pregunta.


En cuanto a while, for, unless, etc, son las palabras clave utilizadas por los "estados de control de flujo"

while (f()) { g() } 

y "modificadores de la afirmación"

g() while f(); 
+1

¿El código ha publicado el código que entiende la máquina virtual de Perl, generado por el intérprete de Perl? – Raphael

+0

@Raphael, Sí, son representaciones de los árboles de código de operación que resultan de compilar los programas. – ikegami

10

Las palabras clave de Perl son las definidas en el archivo regen/keywords.pl dentro de la distribución de origen de Perl. Estos son:

__FILE__, __LINE__, __PACKAGE__, __DATA__, __END__, AUTOLOAD, Begin, Unitcheck, CORE, destruir, END, INIT, CHECK, abs, aceptar, alarma, y, atan2, se unen, binmode , bendecir, romper, llamador, chdir, chmod, chomp, cortar, chown, chr, chroot, cerrar, closedir, cmp, conectar, continuar, cos, cripta, dbmclose, dbmopen, predeterminado, definido, eliminar, morir, do, dump, each, else, elsif, endgrent, endhostent, endnetent, endprotoent, endpwent, endservent, eof, eq, eval, exec, existe, exit, exp, fcntl, fileno, rebaño, for, foreach, tenedor, formato, 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, getsockopt, dado, glob, gmtime, goto, grep, gt, hexadecimal, si, índice, int, ioctl, join, keys, kill, último, lc, lcfirst, le, longitud, enlace, escucha, local, localtime , bloquear, registrar, lstat, lt, m, mapa, mkdir, msgctl, msgget, msgrcv, msgsnd, mi, ne, siguiente, no, no, oct, abrir, opendir, o, ord, nuestro, paquete, paquete , pipe, pop, pos, print, printf, prototipo, push, q, qq, qr, quotemeta, qw, qx, rand, leer, readdir, readline, readlink, readpipe, recv, rehacer, ref, renombrar, requerir, restablecer, devolver, reverse, rewinddir, rindex, rmdir, s, por ejemplo, escalar, buscar, seekdir, seleccionar, semctl, semget, semop, enviar , setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent, setsockopt, cambio, shmctl, shmget, shmread, shmwrite, apagado, el pecado, el sueño, zócalo, socketpair, clasificar, de empalme, dividir, sprintf, sqrt, srand, stat, estado, estudio, sub, substr, symlink, syscall, sysopen, sysread, sysseek, sistema, syswrite, tell, telldir, empate, atado, tiempo, tiempos, tr, truncado, uc, ucfirst , umask, undef, a menos, desvincular, descomprimir, desestabilizar, desvincular, hasta, usar, utime, valores, vec, esperar, waitpid, wantarray, warn, when, while, write, x, xor, y.

El perlsyn, perlop y perlsub páginas de manual son lectura obligatoria, seguido quizás por la página de manual perlfunc. Para saber cómo anular los operadores integrados utilizados con objetos, consulte la página de manual sobrecarga.

+0

¡Nunca vi un idioma con tantas palabras clave! – Raphael

+0

@Raphael: Entonces no mires a COBOL. ;) – musiKk

+3

@Raphael: Probablemente estés pensando en las palabras clave como algo que no se puede anular, como 'if' y' unless'. ** Perl tiene * muy pocas * de esas palabras clave absolutamente inviolables. ** La mayoría de las palabras clave de Perl de 'regen/keywords.pl' pueden de hecho ser anuladas a través de una (o más) de tres formas: mediante la importación de una función de ese nombre desde otro paquete (como en 'chdir' o' open') o bien a través de la vinculación (como en 'keys' o' pop') o la sobrecarga del operador (como en 'print',' cmp', o 'qq'). Que es lo que requiere experiencia con el lenguaje para comprender. – tchrist

1

El built-in los operadores no son subrutinas Perl. Por ejemplo,

#!/usr/bin/perl 

use strict; 
use warnings; 

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

my $ref; 

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

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

La primera $ref->(); es una llamada indirecta; imprime "In foo".

El segundo produce una advertencia:

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

porque print no es el nombre de una subrutina.

+1

fyi, '\ & CORE :: builtin' se está agregando en 5.16. Autovivirá un sub que llama al built-in. – ikegami

0

Simplemente piense en las "funciones incorporadas" como funciones que no creó. Fácil, ¿verdad? :-)

+6

Excepto que no puede tomar una referencia a ellos. Excepto que no puede anular su prototipo y las reglas de análisis especiales prefijando la llamada con '&'. Excepto que no puedes 'goto' ellos. (y estoy seguro de que me falta algo) – ikegami