Perlの代替として(2)

文字列

カンマ区切りのテキストを読んで、2カラム目を合計する。


while(<>) {
split ',';
$sum += $_[1];
}
print $sum, "\n";

これをD言語にすると、


import std.stream;
import std.cstream;
import std.string;
import std.conv;

void main(char[][] arg) {
int sum; // 0で初期化される
foreach(char [] a ; arg[1..length]) {
File inp = new File(a, FileMode.In);
foreach(char [] line ; inp) {
char [][] s = split(line, ",");
// char [][] s = split(line, ','); // 不可
sum += toInt(s[1]);
}
inp.close();
}
dout.writefln(sum);
}

文字列の型は、


char []

で、すなわち文字列は単なる配列らしい。
だから、文字列の配列は、


char [][]

となる。
カンマで区切って配列に入れるのは簡単である。
C++でこれをやるのにどれだけ苦労したことか(しかも遅い)。


char [][] s = split(line, ",");
// char [][] s = split(line, ','); // 不可

下のように、文字で区切るのはダメらしい。
文字列を整数に直すのは、


sum += toInt(s[1]);

toFloatとかtoDoubleとかいろいろある。
Cとちがってちょっとスペースがあったりするとダメ。


import std.stream;
import std.cstream;
import std.conv;

void main(char [][] arg) {
char [] str = "123 ";
int n = toInt(str); // Error: conversion 123
dout.writefln(n);
}

整数を出力するには、フォーマットつき出力分を使う。


dout.writefln(sum);

フォーマットはCと同じように指定できる。


dout.writefln("%04d", sum); // 0030

こういうのは例外を投げる。


int n = toInt(str);
dout.writefln("%13.5f", n); // Error: std.format formatArg