Pregunta

Probé este ejemplo en Perl. ¿Alguien puede explicar por qué es verdad?

  if (defined sdf)  {   print "true";  }

Imprime true .

sdf podría ser cualquier nombre.

Además, si hay una función sdf definida y devuelve 0, entonces no imprime nada.

print (sdf); no imprime la cadena sdf pero

if (sdf eq "sdf")
{
 print "true";
}

imprime verdadero.

La pregunta relacionada permanece si sdf es una cadena. ¿Qué no está impreso por impresión?

¿Fue útil?

Solución

sdf es una bareword .

perl -Mstrict -e "print qq{defined\n} if defined sdf"
Bareword "sdf" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.

Para más diversión, prueba

perl -Mstrict -e "print sdf => qq{\n}"

Ver Hablando estrictamente sobre el uso estricto :

  

El aspecto subs del uso estricto deshabilita la interpretación de `` palabras desnudas '' como cadenas de texto. De manera predeterminada, un identificador de Perl (una secuencia de letras, dígitos y guiones bajos, que no comienza con un dígito a menos que sea completamente numérico) que de otro modo no es una palabra clave incorporada o una definición de subrutina vista anteriormente se trata como una cadena de texto entre comillas:

@daynames = (sun, mon, tue, wed, thu, fri, sat);
     

Sin embargo, esto se considera una práctica peligrosa, ya que pueden producirse errores oscuros:

@monthnames = (jan, feb, mar, apr, may, jun,
               jul, aug, sep, oct, nov, dec);
     

¿Puedes detectar el error? Sí, la décima entrada no es la cadena 'oct', sino más bien una invocación de la función incorporada oct () , que devuelve el equivalente numérico del valor predeterminado $ _ tratado como un número octal.

Corregido: (gracias @ysth)

E:\Home> perl -we "print sdf"
Unquoted string "sdf" may clash with future reserved word at -e line 1.
Name "main::sdf" used only once: possible typo at -e line 1.
print() on unopened filehandle sdf at -e line 1.

Si se proporciona una palabra desnuda para print en la ranura de objeto indirecto, se toma como un identificador de archivo para imprimir. Como no se proporcionan otros argumentos, print se predetermina a imprimir $ _ para manejar el archivo sdf . Como sdf no se ha abierto, falla. Si ejecuta esto sin advertencias, no verá ningún resultado. Tenga en cuenta también:

E:\Home> perl -MO=Deparse -e "print sdf"
print sdf 

sdf es una bareword .

perl -Mstrict -e "print qq{defined\n} if defined sdf"
Bareword "sdf" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.

Para más diversión, prueba

perl -Mstrict -e "print sdf => qq{\n}"

Ver Hablando estrictamente sobre el uso estricto :

  

El aspecto subs del uso estricto deshabilita la interpretación de `` palabras desnudas '' como cadenas de texto. De manera predeterminada, un identificador de Perl (una secuencia de letras, dígitos y guiones bajos, que no comienza con un dígito a menos que sea completamente numérico) que de otro modo no es una palabra clave incorporada o una definición de subrutina vista anteriormente se trata como una cadena de texto entre comillas:

@daynames = (sun, mon, tue, wed, thu, fri, sat);
     

Sin embargo, esto se considera una práctica peligrosa, ya que pueden producirse errores oscuros:

@monthnames = (jan, feb, mar, apr, may, jun,
               jul, aug, sep, oct, nov, dec);
     

¿Puedes detectar el error? Sí, la décima entrada no es la cadena 'oct', sino más bien una invocación de la función incorporada oct () , que devuelve el equivalente numérico del valor predeterminado $ _ tratado como un número octal.

Corregido: (gracias @ysth)

E:\Home> perl -we "print sdf"
Unquoted string "sdf" may clash with future reserved word at -e line 1.
Name "main::sdf" used only once: possible typo at -e line 1.
print() on unopened filehandle sdf at -e line 1.

Si se proporciona una palabra desnuda para print en la ranura de objeto indirecto, se toma como un identificador de archivo para imprimir. Como no se proporcionan otros argumentos, print se predetermina a imprimir $ _ para manejar el archivo sdf . Como sdf no se ha abierto, falla. Si ejecuta esto sin advertencias, no verá ningún resultado. Tenga en cuenta también:

E:\Home> perl -e "print asdfg, sadjkfsh"
No comma allowed after filehandle at -e line 1.

como confirmación de esta observación. Tenga en cuenta también:

E:\Home> perl -e "print asdfg => sadjkfsh"
asdfgsadjkfsh
<*>

Este último imprime ambas cadenas porque = > cita automáticamente las cadenas en el LHS si consisten únicamente en caracteres de 'palabra', eliminando la interpretación del identificador de archivo del primer argumento.

Todos estos ejemplos muestran que el uso de palabras simples genera muchas sorpresas. Debe usar estricto para evitar tales casos.

;

como confirmación de esta observación. Tenga en cuenta también:

<*> <*>

Este último imprime ambas cadenas porque = > cita automáticamente las cadenas en el LHS si consisten únicamente en caracteres de 'palabra', eliminando la interpretación del identificador de archivo del primer argumento.

Todos estos ejemplos muestran que el uso de palabras simples genera muchas sorpresas. Debe usar estricto para evitar tales casos.

Otros consejos

Esta es una " bareword " ;. Si está permitido, tiene el valor de " sdf " y, por lo tanto, no está indefinido.

El ejemplo no es especial:

telemachus ~ $ perl -e 'if (defined sdf) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined abc) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined ccc) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined 8) { print "True\n" };'
True

Ninguno de esos es equivalente a undef que es lo que definido busca.

Es posible que desee consultar este artículo sobre la verdad en Perl: ¿Qué es la verdad?

definido devuelve verdadero si la expresión tiene un valor distinto del valor indefinido.

la función definida devuelve verdadero a menos que el valor pasado en el argumento no esté definido. Esto es útil para distinguir una variable que contiene 0 o '' " de una variable que acaba de parpadear.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top