Microsoft Excel などの表計算アプリケーションにおいて使われている A1 や AB12 と表されたセル名から、行・列番号を求めたり、また逆に行・列番号からセル名を求める Perl コードの覚書き。CPAN モジュールとか絶対に既存だと思うんですが、自分が調べた限りでは見つけられなかったので(´・ω・`)
A1⇔(1,1)、Z1⇔(26,1)、AA1⇔(27,1)、AZ1⇔(52,1)、BA1⇔(53,1)、...
# cell2cr( 'B2' ) ⇒ ( 2, 1 ) sub cell2cr { my( $cell, $col_offset, $row_offset ) = @_; my( $col_name, $row ) = $cell =~ /^([A-Z]+)(\d+)$/i; $col_name or die; $row or die; my $col = 0; $col = $col * 26 + ord( $_ ) - 64 foreach split //, uc $col_name; return ( $col + $col_offset, $row + $row_offset ); # 1 origin }
# cr2cell( 2, 1 ) ⇒ 'B1' sub cr2cell { # 1 origin my( $col, $row, $col_offset, $row_offset ) = @_; $col += $col_offset; 0 < $col or die; $row += $row_offset; 0 < $row or die; my $col_name = ''; do { $col--; $col_name = chr( 65 + $col % 26 ). $col_name; $col = int $col / 26; } while $col; return $col_name. $row; }
# _cell( 'A1', 2,1 ) ⇒ 'C2' sub _cell { return cr2cell( cell2cr( @_ )); }