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


86

10進値を保持する文字列があり、その文字列を浮動小数点変数に変換する必要があります。したがって、私が持っている文字列の例は「5.45」であり、それに.1を追加できるように同等の浮動小数点が必要です。インターネットで検索しましたが、文字列を整数に変換する方法しかわかりません。


質問にはさらに詳細が必要です。文字列は数字だけで構成されていますか?英数字?アルファが削除されても大丈夫ですか?結果の数値には特定の目的がありますか?
JGurtz 2016年

回答:


90

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

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

25
5.55は整数ではありません
OrangeDog 2012年

15
@OrangeDog OPが質問を編集しました(この回答が投稿されてから数か月後)-元の質問には実際には浮動小数点数が含まれていました。
Alnitak 2012年

1
文字列にコンマが含まれている場合の比較はどうですか?
ラミー2014年

[rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" unless "1,000" > 10;' nope [rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" if "1,000" > 10;'
ラミー2014年

73

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

例1

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

結果

123

例2

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

結果

0

7
AFAIUこれは尋ねられたものに対する唯一の答えです
クーガー

4
文字列にゼロを追加するときは注意してください。文字列が「inf」または「nan」で始まる場合、値はゼロにはなりません。例:my $ var2 = "info123"; print $ var2 + 0:結果は次のようになります:Inf
Rodrigo De Almeida Siqueira 2016年

私はaforeach my $i ('00'..'15')を実行していて、いくつかの場所で先行ゼロを削除する必要がありました。この0+数へのキャストもそれを達成します。
stevesliva 2016年

どうやらこれは16進文字列では機能しません: '0x14C' + 0は0(arrggg)になります
Allasso

41

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は名詞よりも動詞を気にするということです。

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


ここでの私の知識の欠如を許してください、しかし私はあなたの2番目の例を完全には得ていません。2つの数値を除算してから乗算しているのですが、これが文字列になるのはなぜですか?
ギデオン2012年

4
私は数を掛けていません。x文字列の複製演算子です。
brian d foy 2013年

3
my $string = ( 45/2 ) x 3; # "22.522.522.5"44ではなく45である必要がありますか?そうしないと、結果の「.5」がどこから来たのか
わかり

10

グーグルは、フィルが尋ねたのと同じ質問(フロートの並べ替え)を検索しているときに私をここに導いてくれたので、スレッドが少し古いにもかかわらず、答えを投稿する価値があると思いました。私はperlに不慣れで、まだ頭を抱えていますが、brian dfoyの声明「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を参照してください。


8

私が理解しているように、int()は、データ型を指定するための「キャスト」関数として意図されたものではなく、コンテキストを算術的なものとして定義するためにここで単に(ab)使用されています。私は過去に(0 + $ val)を(ab)使用して、$ valが数値として扱われるようにしました。


はい、int()「(乱用)使用」されています。とった。
Sapphire_Brick

6
$var += 0

おそらくあなたが望むもの。$ varが数値に変換できませんでした、あなたがエラーを取得しますし、$ varが文字列の場合、しかし、注意して0にリセットされます

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

3

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

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


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

5
Perlには、よりも多くのタイプがありますが、単一の値の場合、それは単一の値にすぎません。
brian d foy 2008年

1

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

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)を追加すると役立ちました。


0

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。と比較しようとしているときに、これに気づきました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.