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"); } } }