2011-06-29 25 views
6
SaveImages @img_sources; 

Lo anterior reportar:¿Por qué no puedo omitir el() aquí?

Array found where operator expected 

Por qué no puedo omitir el () aquí?

+1

No lo sé. ¿De dónde sacas 'SaveImages'? –

+1

Mostrar siempre un script de prueba completo. Esto a menudo mostrará las cosas que están causando el problema, como la falta de una subrutina declarada llamada "Guardar imágenes". –

Respuesta

13

porque su subrutina SaveImages se declara después de la llamada. Los paréntesis no son necesarios si se declara una subrutina antes de la llamada.

ejemplo:

use strict; 
use warnings; 
use Data::Dumper; 
my @ar = (1, 2); 
fn @ar; 
sub fn 
{ 
    print Dumper \@_; 
} 

no funciona, mientras que

use strict; 
use warnings; 
use Data::Dumper; 
my @ar = (1, 2); 
sub fn 
{ 
    print Dumper \@_; 
} 
fn @ar; 

obras.

Este es un comportamiento esperado y se señala en el libro de camello.

-2

Puede omitir () con funciones incorporadas (consulte perlfunc) porque las funciones incorporadas son palabras clave del idioma y no necesitan paréntesis para reconocerlas como funciones.

Algunas funciones importadas (como max de List::Util), generalmente de módulos principales, pueden llamarse sin paréntesis también.

Si se declara una subrutina antes de llamarla, también se pueden omitir los paréntesis, aunque Perl Best Practices (capítulo 2, sección 4) recomienda evitarla para distinguir entre llamadas a subrutinas y complementos.

+2

Tenga en cuenta que los prototipos de funciones de Perl ** _ no son _ ** lo mismo que los prototipos de funciones en otros idiomas (simplemente se llaman mal). Probablemente no quieras usarlos, bueno, casi nunca. Además, -1: incorrecto. Puede omitir parens con subs definidos por el usuario, siempre que el sub se defina antes de donde se llama. –

+1

parens no serían necesarios si hubiera declarado el prototipo correcto. Desea 'sub fn (@) {print @_; } 'y asumí que quería imprimir los contenidos, no el valor de referencia correcto :) –

+0

@Joel Tiene razón. Solo estaba probando y asumí que no importaba. Gracias. Respuesta actualizada –

6

Perl puede analizar las llamadas a subrutinas sin parens cuando esas han sido previamente declaradas (o definidas). Por ejemplo:

sub SaveImages; 

SaveImages @img_sources; 
6

De perlsub:

Para llamar a las subrutinas:

NAME(LIST); # & is optional with parentheses. 
NAME LIST; # Parentheses optional if predeclared/imported. 
&NAME(LIST); # Circumvent prototypes. 
&NAME; # Makes current @_ visible to called subroutine. 

Por lo general, los submarinos no son declarados previamente en la práctica. Eso no suele ser un problema, ya que las personas están generalmente acostumbradas a usar parens con subs creados por programadores.

Perl::Critic (Un módulo que soporta el modelo de Damien Conway de Perltopia como se establece en Perl Best Practices) sugiere los siguientes tratamientos para los submarinos:

  • Prohibir sigilos ampersand.
  • Prohibir prototipos de subrutinas.
  • Prohibe los parientes con funciones integradas.

Una de las razones por las que no se utilizan los parens con las funciones integradas es hacer que sean visualmente distintas de las funciones definidas por el programa, que tradicionalmente utilizan los parens. Dado que es inusual predecir los subs, y se desaconseja usar el signo comercial (porque altera cómo se puede tratar @_), o los prototipos (porque, bueno, es una historia larga), eso deja una base muy fuerte para usar parens con scripts. submarinos definidos

4

Muchos puntos buenos aquí, solo uno más: vea también el subs pragma. Utilizado como use subs qw/SaveImage/; antes de su llamada de función (probablemente cerca de la parte superior con las otras llamadas use), debe predefinir muy bien su sub de una manera menos molesta.

Cuestiones relacionadas