web-dev-qa-db-ja.com

Perlで文字列を数値に変換するにはどうすればよいですか?

Perlで数値を保持する文字列を数値に変換するにはどうすればよいですか?

81
Anton

変換する必要はまったくありません。

% Perl -e 'print "5.45" + 0.1;'
5.55
89
Alnitak

これは簡単な解決策です。

例1

my $var1 = "123abc";
print $var1 + 0;

結果

123

例2

my $var2 = "abc123";
print $var2 + 0;

結果

0
69
porquero

Perlはコンテキストベースの言語です。それはあなたがそれを与えるデータに従って仕事をしません。代わりに、使用する演算子とそれらを使用するコンテキストに基づいてデータを処理する方法を見つけます。数字を並べ替えると、数字が得られます。

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

文字列を並べ替えると、文字列が得られます。

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

Perlはほとんど何をすべきかを理解し、ほとんど正しいです。同じことを別の言い方をすると、Perlは名詞よりも動詞を重視します。

何かをしようとしていて、それが機能していませんか?

40
brian d foy

Googleはここでphillが尋ねたのと同じ質問(フロートの並べ替え)で検索しているので、スレッドが古くても答えを投稿する価値があると考えました。私はPerlを初めて使い、頭を抱えていますが、brian d foyの声明は「Perlは名詞よりも動詞を重視しています」と述べています。上記は本当に頭に釘を打ちます。ソートを適用する前に、ストリングをフロートに変換する必要はありません。値を文字列ではなく数値としてソートするようにソートに指示する必要があります。つまり.

my @foo = ('1.2', '3.4', '2.1', '4.6');
my @foo_sort = sort {$a <=> $b} @foo;

ソートの詳細については、 http://perldoc.Perl.org/functions/sort.html を参照してください

10
Norm

私が理解しているように、 int() は、データ型を指定するための「キャスト」関数として意図されたものではありません。過去に(0 + $ val)を(ab)使用して、$ valが数値として扱われるようにしました。

8
mccutchm
$var += 0

おそらくあなたが望むもの。ただし、$ varが文字列を数値に変換できない場合、エラーが発生し、$ var にリセットされます

my $var = 'abc123';
print "var = $var\n";
$var += 0;
print "var = $var\n";

ログ

var = abc123
Argument "abc123" isn't numeric in addition (+) at test.pl line 7.
var = 0
6
indexless

Perlには、実際にはスカラー、配列、ハッシュの3つのタイプしかありません。そして、その区別さえ議論の余地があります。 ;)各変数の処理方法は、それをどうするかによって異なります。

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


% Perl -e "print '5.4' + '3.4';"
8.8
3
Rini

比較では、スカラーが文字列の数である場合に違いが生じます。そして、それは常に決定可能ではありません。 Perlが「科学的」記法で浮動小数点数を取得し、比較で同じ数行を使用した場合を報告できます。

use strict;
....
next unless $line =~ /and your result is:\s*(.*)/;
my $val = $1;
if ($val < 0.001) {
   print "this is small\n";
}

そして、ここで$valは、例えば"2e-77"から取得した$line。 0(または優れたole Cプログラマーの場合は0.0)を追加すると役に立ちました。

1
Steffen Moeller

Perlは弱く型付けされ、コンテキストベースです。多くのスカラーは、使用する演算子に応じて、文字列と数値の両方として扱うことができます。 $a = 7*6; $b = 7x6; print "$a $b\n";
42 777777を取得します。

ただし、微妙な違いがあります。テキストファイルからデータ構造に数値データを読み取り、Data::Dumperで表示すると、数値が引用符で囲まれていることに気付くでしょう。 Perlはそれらを内部的に文字列として扱います。
読み取り:$my_hash{$1} = $2 if /(.+)=(.+)\n/;
ダンプ:'foo' => '42'

ダンプに引用されていない番号が必要な場合:
読み取り:$my_hash{$1} = $2+0 if /(.+)=(.+)\n/;
ダンプ:'foo' => 42

$2+0の後、数値演算子を使用したため、Perlは$ 2を数値として処理したことに気付きます。

2つのハッシュをData::Dumperと比較しようとしたときに、これに気付きました。

0
SzG