はじめに
*Pocket詳解 Perl/CGI辞典*をパラパラっと眺めておりましたら、pack/unpack 関数が目に留まりましたので、投稿いたします。
次の文字を取得する場合
'A' の次の文字 'B' を取得する場合、
C言語でしたら、'A' + 1 より 'B' を得られます。
しかし Perl の場合、'A' + 1 の結果は、1 となってしまいます。
pack/unpack 関数
よって、次の文字を取得する場合、一旦バイナリ値に変換し足し算を行ってから、char 値に逆変換することにより、期待する操作が行えます。
pack char値をバイナリ値に変換
unpack バイナリ値をchar値に変換
Perl | Ruby | Python |
---|---|---|
pack/chr | pack/chr | chr |
unpack/ord | unpack/ord | ord |
unpack.pl
unpack("C*", 'A'); # => 65
pack("C*", 66); # => B
unpack.rb
"A".ord # => 65
66.chr # => B
Python に pack/unpack があるかどうかは不明 適当
B - ROT N
perl.pl
use v5.18;
use warnings;
chomp (my $n = <STDIN>);
chomp (my $s = <STDIN>);
my @s = split '', $s;
map {$s[$_] = chr((ord($s[$_]) + $n) % ord("A") % 26 + ord("A"))} (0..@s-1);
say join('', @s);
ruby.rb
n = gets.chomp.to_i
s = gets.chomp.split('')
(0..s.size-1).each do |i|
s[i] = ((s[i].ord + n) % "A".ord % 26 + "A".ord).chr
end
puts s.join()
むむっ、ruby のスッキリ感は凄いですね。
まとめ
- Perl の関数 pack/unpack を覚えた
- Ruby のメソッド chr/ord も覚えた