sironekotoroの日記

Perl で楽をしたい

Perlトレーニングブック Part 06

6章 文字列操作の関数・演算子

  • length() 文字列の長さを求める
  • 文字列A eq 文字列B 文字列を比較する
  • $str = '文字列' 文字列のコピー
    • C言語だと文字列の扱いが大変らしい
  • '文字列A' . '文字列B' 文字列の連結
  • m// 文字列検索・置換
    • mは省略可能
    • 確かに付けた覚えあんまりない
  • s/検索文字列/置換文字列/オプション 文字列置換
    • おなじみ
    • オプションは/g/s
      • /g 対応する文字列すべてを置換する
      • /s 大文字小文字の区別をしない
  • tr/旧文字列/新文字列/オプション 文字列置換
    • ただしこちらは、s//と違って1文字ずつ置き換えていく
      • 旧文字列と新文字列が違った場合に注意
      • bがAに、cがBに、dがCに、eが・・・Cに!?
my $buf = 'abcdefghij';
$buf =~ tr/bcde/ABC/;
print $buf;    # aABCCfghij
                # bがAに、cがBに、dがBに、eがBに
my $buf = 'abcdefghij';
$buf =~ tr/bcde/AB/;
print $buf;    # aABBBfghij
  • なお、旧文字列よりも新文字列の方が長いとエラーが出る

    • Replacement list is longer than search list
  • 文字を数値に変換する

    • 見た目は数値でも、文字として表示されている場合がある。
my $n = 0x41;
print $n;  # 65
  • pack(“C”,文字) 文字からバイナリ値へ置換する
my $n = 0x41;
print pack ("C",$n);  # A
  • pack ("C*",$n) 文字「列」を数値に変換する
  • sprintf(%d|%x , 数値)数値を文字列にかえる
    • %dは10進数、%xは16進数
my $n =2004;
my $buf = sprintf("%d",$n);
print $buf;
  • 文字列’2’,’0’,’0’,’4’を数値の2004にする
    • なんか迂遠な事やってんなー
my @num = ('2','0','0','4');
my $len = @num;

my $val = 0;
for (my $i = 0 ; $i < $len ; $i++){
    $val = 10 * $val + $num[$i];
}
print $val,"\n";
  • 配列@numから文字を1つ取り出し、それに10をかけて変数$valに格納。それを桁数分繰り返す。

文字の判別

  • 正規表現の話
  • キャラクタークラス、知ってはいたが初めて自分で書いてみた。
    • [[:alpha:]]
    • [[: :]]で囲むんだなぁ、後ろの:忘れた。やっぱ書かないとわからん事あるよね。
  • この本全体に言えるんだけど、扱ってない関数とかで「トレーニング問題」とか出されるとやる気無くすわー。それまでに習った知識の範囲でとレーニング問題作ってほしい
    • 2004年の本に言っても仕方ないけど。
  • 印刷可能な文字列を表示する
    • 印刷可能文字[[:print:]]
    • chr()は数値から文字への変換を行う
my $cnt = 0;
for ( my $i = 0; $i < 256; $i++ ) {
    my $n = chr($i);
    if ( $n =~ /[[:print:]]/ ) {
        printf( "%c(%x)", $i, $i );
        $cnt++;
        if( $cnt % 8 == 0){
            printf("\n");
        }
    }
}
  
  • いつもながら文字コードのところは何やってるか何がなんなんだか。
  • 他の本のように、「Perlは内部ではunicodeで文字を処理しています」で終わらせたい。
  • つか、use Encode;で良いよね。
  • 文字コードのあたりで嫌になって辞めてる人多そう(うちも何回か放り出した)