sub do_printf { printf @_ }
sub do_sprintf { print sprintf @_ }
do_printf("%s\n", "ok"); # prints ok
do_sprintf("%s\n", "ok"); # prints 2
Respuesta
Desde el perldoc on sprintf:
A diferencia de printf, sprintf no hace lo que probablemente significa que cuando se pasa es una matriz como su primer argumento. La matriz se da contexto escalar, y en lugar de utilizar el elemento 0 ª de la matriz como el formato, Perl usará el recuento de elementos en la matriz como el formato, que es casi nunca útil.
sprintf evalúa la matriz en contexto escalar. Su matriz tiene dos elementos, por lo que se evalúa como "2" (sin un seguimiento \ n).
sprintf
tiene un prototipo [email protected]
mientras printf
tiene prototipo de @
+1 Una mejor respuesta técnica que la mía :-) – crazyscot
Pero, ¿alguien tiene una idea, por qué? En general, tales cosas no obvias significan que hay algo de DWIM implícito aquí. – codeholic
A adivinar de la nada: 'sprintf' tiene el prototipo' ($ @) 'porque puede; 'printf' no tiene ningún prototipo porque (como' print') puede tomar una manejador de archivos (por ejemplo, 'printf FH' format ', ... 'por lo que requiere magia del analizador más allá de lo que el sistema prototipo puede administrar. – hobbs
respuestas Ver codeholic
's y Mark
' s para la explicación de por qué se comportan de manera diferente.
Como solución alternativa, sólo tiene que hacer:
sub do_sprintf { print sprintf(shift, @_) }
Entonces,
sub do_printf { printf @_ }
sub do_sprintf { print sprintf(shift, @_) }
do_printf("%s\n", "ok"); # prints ok
do_sprintf("%s\n", "ok2"); # prints ok2
que hacen cosas diferentes. Para printf
la salida es a una secuencia; para sprintf
desea que la cuerda se construya. Maneja el formato (f) del comando de impresión. El objetivo principal de printf
es imprimir el valor que construye en una secuencia, pero con s (tring) printf (ormat) solo intenta crear la cadena, no imprimirla.
printf
devuelve la cantidad de caracteres impresos en una secuencia como comentarios. Una vez que los caracteres se imprimen en una secuencia, se han eliminado de la estructura lógica del programa. Mientras tanto, sprintf
necesita devolverle una cadena. La forma más conveniente es como un valor de retorno, que debido a que está dentro de la estructura del programa puede inspeccionarse por su longitud, o si contiene alguna 'e', o lo que usted desee.
¿Por qué no debería se comportan de manera diferente?
- 1. Haskell: ¿Por qué los tipos Maybe y Either se comportan de manera diferente cuando se usan como Monads?
- 2. ¿Por qué los operadores de división (/) se comportan de manera diferente en VB.NET y C#?
- 3. ¿Por qué las comas se comportan de manera diferente en int.Parse() y decimal.Parse() con InvariantCulture?
- 4. Hacer autoboxing y unboxing se comportan de manera diferente en Java y C#
- 5. ¿Por qué los parámetros se comportan así?
- 6. ¿Por qué Array.slice se comportan de forma diferente para (longitud, n)
- 7. Tomcat 6.0 y Eclipse. Varias instancias del servidor se comportan de manera diferente
- 8. ¿Los hilos creados en Java se comportan de manera diferente en Windows y Linux?
- 9. Cuadrícula dentro de un StackPanel: ¿por qué auto y * se comportan de manera extraña?
- 10. ¿Por qué el mismo RegExp se comporta de manera diferente?
- 11. Configurar colores en hexadecimal y decimal se comportan de manera diferente
- 12. Diferencia entre fprintf, printf y sprintf?
- 13. ¿Por qué Linq se une de manera diferente
- 14. Javascript declaración de matriz: new Array(), new Array (3), [ 'a', 'b', 'c'] crear matrices que se comportan de manera diferente
- 15. SharePoint: los eventos de todo el día se comportan de manera diferente en la consulta CAML
- 16. ¿Por qué se les llama "la pandilla de los cuatro"?
- 17. explique por qué estas dos funciones incorporadas se comportan diferente cuando pasan argumentos de palabra clave en
- 18. El programa se bloquea cuando le doy a printf un puntero a una matriz de caracteres
- 19. Los valores de Float se comportan de forma diferente en las compilaciones de versión y depuración
- 20. ¿Por qué se implementan AsObservable y AsEnumerable de forma diferente?
- 21. ¿Por qué el operador de módulo se comporta de manera diferente en Perl y PHP?
- 22. ¿Cómo encontrarías la altura de los objetos a los que se les da una imagen?
- 23. El portapapeles se comporta de manera diferente en .NET 3.5 y 4, pero ¿por qué?
- 24. ¿Por qué (x + = x + = 1) se evalúa de manera diferente en C y Javascript?
- 25. Ubuntu Firefox se representa de manera diferente
- 26. ¿Por qué la salida es diferente?
- 27. ¿Por qué Sprintf() no genera nada?
- 28. ¿Por qué una matriz C tiene un valor de sizeof() incorrecto cuando se pasa a una función?
- 29. ¿Por qué se llama onResume() cuando se inicia una actividad?
- 30. ¿Por qué printf() es una función impura?
... OK, gracias por decir lo obvio, y la respuesta a la pregunta del cartel es? ... – vladr