Snippets

sironekotoro キャメルケースをスネークケースに

Created by sironekotoro
#!/usr/nbin/perl
use strict;
use warnings;

# https///twitter.com/perlzemi/status/11414955238005
# Perl入学式で、何をしたらいいですかと聞かれたりするので、 何も思いつかない方のために、演習問題をひとつ。
# [キャメル-スネーク変換]
# 入力 AbcDefGhi 出力 abc_def_ghi を
# 1. 正規表現なしでループで処理する
# ものと
# 2. 正規表現を使う
# ものを作ってみてください。

# このスクリプトは
# 1. 正規表現なしでループで処理する(Perl入学式の範囲外)
# で解いてます

my $str = 'AbcDefGhi';

use String::CamelCase qw/decamelize/;

print decamelize($str); #abc_def_ghi
#!/usr/nbin/perl
use strict;
use warnings;

# https///twitter.com/perlzemi/status/11414955238005
# Perl入学式で、何をしたらいいですかと聞かれたりするので、 何も思いつかない方のために、演習問題をひとつ。
# [キャメル-スネーク変換]
# 入力 AbcDefGhi 出力 abc_def_ghi を
# 1. 正規表現なしでループで処理する
# ものと
# 2. 正規表現を使う
# ものを作ってみてください。

# このスクリプトは
# 1. 正規表現なしでループで処理する(Perl入学式の範囲内)
# で解いてます

my $str = 'AbcDefGhi';

# 回答格納用のスカラー変数
my $answer;

# 愚直なハッシュテーブル
# lc 教えてないからfor文でハッシュテーブル構築できない!
my %hash = (
    A => '_a',
    B => '_b',
    C => '_c',
    D => '_d',
    E => '_e',
    F => '_f',
    G => '_g',
    H => '_h',
    I => '_i',
    J => '_j',
    K => '_k',
    L => '_l',
    M => '_m',
    N => '_n',
    O => '_o',
    P => '_p',
    Q => '_q',
    R => '_r',
    S => '_s',
    T => '_t',
    U => '_u',
    V => '_v',
    W => '_w',
    X => '_x',
    Y => '_y',
    Z => '_z',
);

# 中間処理用のテンポラリ
my $temp = '';

# ループ処理
for my $char ( split //, $str ) {
    if ( $hash{$char} ) {
        $temp .= $hash{$char};
    }
    else {
        $temp .= $char;
    }
}

# この時点で $temp には _abc_def_ghi が入ってる

# でも最初の _ はどうする?うーんsubstrは教えていない・・・
# 無条件に捨ててもいいかな?
# いや、変換後の最初の文字が_から始まるとは限らないし

# 頑張ってif文にしよう
# splitで1文字ずつ分割
my @array = (split //, $temp);

# 配列の先頭が _ だったらshiftして取り出して捨てる
if ($array[0] eq '_' ){
    shift @array;
}

# 配列を join でつなげて答えにする
$answer = join '', @array;
print $answer;
#!/usr/nbin/perl
use strict;
use warnings;

# https///twitter.com/perlzemi/status/11414955238005
# Perl入学式で、何をしたらいいですかと聞かれたりするので、 何も思いつかない方のために、演習問題をひとつ。
# [キャメル-スネーク変換]
# 入力 AbcDefGhi 出力 abc_def_ghi を
# 1. 正規表現なしでループで処理する
# ものと
# 2. 正規表現を使う
# ものを作ってみてください。


# 2. 正規表現を使う(Perl入学式の範囲外)
my $str = 'AbcDefGhi';

# 先頭が大文字だったら小文字に置換する
$str =~ s/\A(.)/\l$1/x;

# 大文字だったら、 アンダースコア付きの小文字 に置換する
$str =~ s/([A-Z])/_\l$1/g;

print $str; # abc_def_ghi
#!/usr/nbin/perl
use strict;
use warnings;

# https///twitter.com/perlzemi/status/11414955238005
# Perl入学式で、何をしたらいいですかと聞かれたりするので、 何も思いつかない方のために、演習問題をひとつ。
# [キャメル-スネーク変換]
# 入力 AbcDefGhi 出力 abc_def_ghi を
# 1. 正規表現なしでループで処理する
# ものと
# 2. 正規表現を使う
# ものを作ってみてください。

# このスクリプトは
# 2. 正規表現を使う(Perl入学式の範囲内)
# で解いてます

my $str = 'AbcDefGhi';

# 全ての大文字の前に _ を入れる
# [A-Z] 大文字の文字クラス
# ([A-Z]) 大文字の文字クラスを ( ) で囲んで、$1 で参照できるようにしたもの
$str =~ s/([A-Z])/_$1/g;    # _Abc_Def_Ghi

# 全てを小文字にする... \l 教えてたら楽なのだけどなぁ・・・教えてないし。
# 困った時のハッシュテーブル(とっても愚直な書き方)
my %hash = (
    A => 'a',
    B => 'b',
    C => 'c',
    D => 'd',
    E => 'e',
    F => 'f',
    G => 'g',
    H => 'h',
    I => 'i',
    J => 'j',
    K => 'k',
    L => 'l',
    M => 'm',
    N => 'n',
    O => 'o',
    P => 'p',
    Q => 'q',
    R => 'r',
    S => 's',
    T => 't',
    U => 'u',
    V => 'v',
    W => 'w',
    X => 'x',
    Y => 'y',
    Z => 'z',
);

# 大文字[A-Z]は、() で囲まれているので、該当すれば $1 に入る
# $1をkeyとしてhashをさがし、valueの小文字に置き換える
$str =~ s/([A-Z])/$hash{$1}/g;

# 先頭に _ があれば置換で削除する
$str =~ s/^_//;

print $str;

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.