2008-11-14 32 views
74

¿Cómo convertiría una cadena que contiene un número en su valor numérico en Perl?¿Cómo puedo convertir una cadena en un número en Perl?

+3

Algunas de las respuestas son confusas porque la pregunta ha sido editada. La respuesta por porquero es mejor para esta versión de la pregunta. – TimK

+0

La pregunta necesita más detalles. ¿La cuerda solo está compuesta de números? ¿Alfanumérico? Ok, si alphas son despojados? ¿Hay un propósito específico para el número resultante? – JGurtz

Respuesta

83

No es necesario para convertirlo en absoluto:

% perl -e 'print "5.45" + 0.1;' 
5.55 
+18

5.55 no es un número entero – OrangeDog

+13

@OrangeDog OP modificó la pregunta (algunos meses después de que se publicó esta respuesta): la pregunta original en realidad tenía números de coma flotante. – Alnitak

+1

¿qué pasa con las comparaciones cuando la cadena tiene una coma? – Ramy

3

Perl en realidad sólo tiene tres tipos: escalares, arrays y hashes. E incluso esa distinción es discutible. ;) La forma en que se trata cada variable depende de lo que haga con ella:

% perl -e "print 5.4 . 3.4;" 
5.43.4 


% perl -e "print '5.4' + '3.4';" 
8.8 
+4

Perl tiene muchos más tipos que, pero para valores únicos, es solo un valor único –

+2

también puedes agregar 0 –

40

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 lo hace números tipo de cosas, se obtiene números:

# numeric addition with strings: 
my $sum = '5.45' + '0.01'; # 5.46 

si lo hace cadenas tipo de cosas, se obtiene cuerdas:

# string replication with numbers: 
my $string = (45/2) x 4; # "22.522.522.522.5" 

Perl en su mayoría se da cuenta de qué hacer y sobre todo es 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?

+0

Perdona mi falta de conocimiento aquí, pero no entiendo muy bien tu segundo ejemplo. Estás dividiendo dos números, luego multiplicándolos, ¿cómo/por qué esto da como resultado una cadena? – gideon

+4

No estoy multiplicando números. El 'x' es el operador de replicación de cadena. –

+1

oh ya veo. ¡Gracias! :) Perl seguro tiene muchos operadores. – gideon

9

Google llévame aquí mientras buscas 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 tipo

6

Según entiendo int() no pretende ser una función 'fundido' para designar el tipo de datos es simplemente ser (ab) usa aquí para definir el contexto como una aritmética. He usado (ab) (0 + $ val) en el pasado para asegurarme de que $ val se trate como un número.

54

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 
+5

AFAIU esta es la única respuesta a lo que se pidió – Cougar

+0

@Cougar: estoy de acuerdo. –

+1

Tenga cuidado al agregar cero a una cadena. Si la cadena comienza con "inf" o con "nan", el valor no será cero. P. ej. my $ var2 = "info123"; print $ var2 + 0: El resultado será: Inf –

1

En las comparaciones, hace una diferencia si un escalar es un número de una cadena. Y no siempre es decidible.Puedo informar de un caso en el Perl recuperó un flotador en la notación "científica" y utiliza ese mismo unas líneas más adelante 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 por ejemplo numérico "2e-77" recuperado de $line. Agregar 0 (o 0.0 para los buenos programadores de ole C) ayudó.

6
$var += 0 

Probablemente lo que quiere. Se advierte sin embargo, si $ var es la cadena no se puede convertir a numérico, obtendrá 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 
0

Perl está débilmente tipado 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";
Obtiene 42 777777.

Hay una diferencia sutil, sin embargo. Cuando lea datos numéricos de un archivo de texto en una estructura de datos y luego los vea con Data::Dumper, notará que sus números están entre comillas. Perl los trata internamente como cadenas.
Leído: $my_hash{$1} = $2 if /(.+)=(.+)\n/;.
Dump: 'foo' => '42'

Si desea que los números no cotizados en un vertedero:
Leer: $my_hash{$1} = $2+0 if /(.+)=(.+)\n/;.
Dump: 'foo' => 42

Después $2+0 Perl se da cuenta de que ha tratado $ 2 como un número, ya que utiliza un operador numérico.

Me di cuenta de esto al intentar comparar dos valores hash con Data::Dumper.

Cuestiones relacionadas