文字列をn文字ずつに分割する

hexファイルやmotファイルとかでチェックサムとる為に、16進文字列を2文字ずつに区切って加算するってやつ。

Perl

perlなら listコンテキストに正規表現置いて

quartz:pts/3% perl -E 'foreach $i (shift =~ /../g) { $sum += hex($i); } say sprintf "%x", $sum' CAFEBABE
or
quartz:pts/3% perl -MList::Util=sum -E 'say sprintf "%x", (sum( map {hex} shift =~ /../g));' CAFEBABE
340

追記: List::Util忘れてた。

Python

pythonなら re.findallを使って

quartz:pts/3% python -c 'import re,sys; print hex(sum([int(x,16) for x in re.findall("..", sys.argv[1])]))' CAFEBABE
0x340

とかすればいいんだけど、rubyでやろうとしてふと困ってしまった。結局面倒になって pythonでやってる自分がいた。怠け者め。

Ruby

さらに追記:
これでいいのかな。

quartz:pts/1% ruby -e 's=0; ARGV[0].gsub(/../) {|x| s+=x.hex}; puts s.to_s(16)' cafebabe
340

なんかすごくダサい気もするんだけど・・・

Haskell

ワルノリ

import System
import Numeric

hex :: [Char] -> [Int]
hex [] = []
hex (c:c':rest) = (fst . head . readHex) [c,c'] : hex rest

checksum = sum . hex 

main = do cs <- getArgs
          print $ (flip showHex "" . checksum . head) cs
quartz:pts/1% ./checksum cafebabe                                       /home/kuro
"340"

暇だなおいら。