string - ejemplos - django
¿Cómo puedo convertir una cadena en un número en Perl? (9)
Como yo entiendo, int() no está pensado como una función de ''molde'' para designar el tipo de datos simplemente se usa (ab) aquí para definir el contexto como aritmético. He usado (ab) (0 + $ val) en el pasado para asegurarme de que $ val se trate como un número.
¿Cómo convertiría una cadena que contenga un número en su valor numérico en Perl?
En las comparaciones, hace una diferencia si un escalar es una cantidad de una cadena. Y no siempre es decidible. Puedo informar un caso en el que Perl recuperó un flotador en notación "científica" y lo usé unas líneas abajo en una comparación:
use strict;
....
next unless $line =~ /and your result is:/s*(.*)/;
my $val = $1;
if ($val < 0.001) {
print "this is small/n";
}
Y aquí $val
no se interpretó como numérico, por ejemplo, "2e-77"
recuperado de $line
. Agregar 0 (o 0.0 para los buenos programadores de ole C) ayudó.
Esta es una solución simple:
Ejemplo 1
my $var1 = "123abc";
print $var1 + 0;
Resultado
123
Ejemplo 2
my $var2 = "abc123";
print $var2 + 0;
Resultado
0
Google me guió aquí mientras buscaba la misma pregunta que phill preguntó (ordenando flotadores), así que pensé que valdría la pena publicar la respuesta a pesar de que el hilo era viejo. Soy nuevo en Perl y sigo teniendo la cabeza agachada, pero la declaración de Brian Foy "a Perl le importan más los verbos que los sustantivos". arriba realmente da en el clavo en la cabeza. No es necesario convertir las cuerdas en flotadores antes de aplicar el género. Debe indicar a la ordenación que clasifique los valores como números y no como cadenas. es decir
my @foo = (''1.2'', ''3.4'', ''2.1'', ''4.6'');
my @foo_sort = sort {$a <=> $b} @foo;
Ver http://perldoc.perl.org/functions/sort.html para más detalles sobre el género
No necesita convertirlo en absoluto:
% perl -e ''print "5.45" + 0.1;''
5.55
Perl es un lenguaje basado en el contexto. No hace su trabajo de acuerdo con los datos que le das. En cambio, se da cuenta de cómo tratar los datos en función de los operadores que utiliza y el contexto en el que los utiliza. Si haces números de tipos de cosas, obtienes números:
# numeric addition with strings:
my $sum = ''5.45'' + ''0.01''; # 5.46
Si haces cadenas de cosas, obtienes cadenas:
# string replication with numbers:
my $string = ( 45/2 ) x 4; # "22.522.522.522.5"
Perl, en su mayoría, descubre qué hacer y, en general, es lo correcto. Otra forma de decir lo mismo es que a Perl le importan más los verbos que los sustantivos.
¿Estás tratando de hacer algo y no está funcionando?
Perl está débilmente tipeado y basado en el contexto. Muchos escalares pueden tratarse como cadenas y números, dependiendo de los operadores que use. $a = 7*6; $b = 7x6; print "$a $b/n";
42 777777
.
Sin embargo, hay una diferencia sutil. Cuando lee datos numéricos de un archivo de texto en una estructura de datos y luego los visualiza con Data::Dumper
, notará que sus números están entre comillas. Perl los trata internamente como cadenas.
Lea: $my_hash{$1} = $2 if /(.+)=(.+)/n/;
.
Volcado: ''foo'' => ''42''
Si quiere números sin comillas en el volcado:
Lea: $my_hash{$1} = $2+0 if /(.+)=(.+)/n/;
.
Volcado: ''foo'' => 42
Después de $2+0
Perl se da cuenta de que ha tratado $ 2 como un número, porque utilizó un operador numérico.
Me di cuenta de esto al intentar comparar dos hashes con Data::Dumper
.
Perl realmente solo tiene tres tipos: escalares, matrices y hash. E incluso esa distinción es discutible. ;) La forma en que se trata cada variable depende de lo que hagas con ella:
% perl -e "print 5.4 . 3.4;"
5.43.4
% perl -e "print ''5.4'' + ''3.4'';"
8.8
$var += 0
Probablemente lo que quieres Sin embargo, ten en cuenta que si $ var es una cadena que no se puede convertir a numérica, obtendrás el error y $ var se restablecerá a 0 :
my $var = ''abc123'';
print "var = $var/n";
$var += 0;
print "var = $var/n";
registros
var = abc123
Argument "abc123" isn''t numeric in addition (+) at test.pl line 7.
var = 0