|
文字列の操作
ここにくるまで正規表現とかさんざん文字列の操作をしてきたのに何をいまさらという
感じもするのですが、なんとなく後回しになってしまいました。(^-^;
ではここまでのおさらい。
おさらい
シングルクォートとかシングルクォーテーション、ダブルクォート、ダブルクォーテーシ
ョンが正式名称ですがたいていは「ちょんちょん」と呼ぶでしょう。
'' でくくると正味そのまま文字列として扱い。"" だと中に変数があった場合その値を
展開してくれます。
以下のような感じになります。
#!c:/perl/bin/perl
print "Content-type:text/html\n\n";
my $x = '質問';
my $y = '疑問文';
my $xx = "$xを$xで";
my $yy = "$yには$yで";
print "$xx返すなあーっ!!$yy答えろと学校で教えているのか?<br>";
print '$xx返すなあーっ!!$yy答えろと学校で教えているのか?';
↓
質問を質問で返すなあーっ!!疑問文には疑問文で答えろと学校で教えているのか?
"$xx返すなあーっ!!$yy答えろと学校で教えているのか?
|
ほか以下のようなものがありましたね。
演算子 | 意味 | 使用例 |
x | 繰り返し | $str = "a" x 10; → $str = "xxxxxxxxxx"; @x = (1) x 10; → @x = (1,1,1,1,1,1,1,1,1,1); |
. | 連結 | $str = "x"."y"; → $str = "xy"; |
演算子 | 意味 | 使用例 |
eq | 等しい | |
ne | 等しくない | |
gt | 右辺より左辺が大きい | $x gt $y |
lt | 左辺より右辺が大きい | $x lt $y |
ge | 右辺より左辺が大きい 又は等しい | $x ge $y |
le | 左辺より右辺が大きい 又は等しい | $x le $y |
イコール、ノットイコール、グレーター、リトラー、グレーターイコール、リトラーイコールの略です。
文字列関数
そのほかに使いそうなものを並べておきます。
関数 | 意味 |
uc | 大文字に変換 |
lc | 小文字に変換 |
substr | 文字列の切り出し |
length | 長さ(バイト)を返します |
index | 検索した文字が最初に見つかった位置 |
rindex | 〃 最後 〃 |
localtime | 現在時間取得 |
sprintf | 書式設定 |
chop | 文末の1文字を削除 |
chomp | 改行コードを削除 |
s | 文字の置き換え(正規表現) |
tr | 文字変換 |
split | 文字列分割 |
join | 文字列結合 |
reverse | 配列の順番を逆にします |
crypt | 暗号化 |
uc(大文字に変換)lc(小文字に変換)の例。
|
uc($x); uc $x; lc($x); lc $x;
|
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
$x = uc('diablo2');
$y = lc('LOAD OF DESTRUCTION');
print $x;
print '<br>';
print $y;
↓
DIABLO2
load of destruction
|
substr(文字列の切り出し)の例。
|
substr(文字列,開始位置,文字長)
開始位置は0から
文字長省略:最後まで
開始位置マイナス:後ろから遡った位置
|
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
$x = 'Dungeon Keeper';
#切り出し
$a = substr($x,0,7);
print $a.'<br>';
#先頭に追加
substr($x,0,0) = 'I love ';
print $x.'<br>';
#置き換え
substr($x,14,7) = 's & Dragons';
print $x.'<br>';
#削除
substr($x,0,6) = '';
print $x.'<br>';
#マイナスは後ろから
#後ろから11バックした位置から11文字
substr($x,-11,11) = '';
print $x.'<br>';
↓
Dungeon
I love Dungeon Keeper
I love Dungeons & Dragons
Dungeons & Dragons
Dungeon
|
length(長さ(バイト)を返します)の例。
|
length($x); length $x;
|
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
$x = 'ハーレムアニメ';
print length($x);
↓
14
(全角文字なので2倍の数字になります)
|
index rindex(検索位置)の例。
|
index ( 文字列, 検索文字列, 開始位置 )
rindex ( 文字列, 検索文字列, 開始位置 )
index :検索した文字列が最初に見つかった位置を返します。
rindex: 〃 最後 〃
開始位置は0から
開始位置省略:初めから
見つからない場合は -1 を返します。
|
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
$x = '天地無用→サクラ対戦→ラブひな→シスタープリンセス→魔法先生ネギま!';
print index($x,'ス') . '<br>';
print rindex($x,'ス');
↓
34
48
(全角文字なので2倍の数字になります)
|
見つからなかったときには 0 や "" ではなく -1 を返しますので、if文での判定には
注意してください。
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
$x = '天地無用→サクラ対戦→ラブひな→シスタープリンセス→魔法先生ネギま!';
print 'ありませんでした' if (!index($x,'ああっ女神さまっ'));
print '有りませんでした' if (0 > index($x,'ああっ女神さまっ'));
↓
有りませんでした
(下の方法が正しい書き方です)
|
localtime(現在時間取得)の例。
|
まず時間は time; で取得できます。今試しに print time; とすると 1148114751 となり
ました。
これを人間が見て幾分わかりやすく表示するには print localtime(time); とします。
すると 51451720410661390 と表示されます。
これは以下のような内容を表しています。
51秒、45分、17時、20日、5月(4+1=5)、2006年(1900+106)、土曜日(日曜日から
6番目)、1月1日から140(139+1)日目、サマータイムでは無い(0)
|
sprintf(書式設定)の例。
|
sprintf (書式,文字列)
コード | 意味 |
%c | 文字 |
%d | 10進数 |
%e | 浮動小数(指数形式) |
%E | 浮動少数(大文字のEを使った指数形式) |
%f | 浮動小数(固定小数点形式) |
%g | 浮動小数(浮動少数または指数形式のうち、少ないスペースで表現できる方) |
%G | %g の指数表示をEにしたもの |
%ld | 倍精度10進数 |
%lo | 倍精度8進数 |
%lu | 倍精度符号なし10進数 |
%lx | 倍精度16進数 |
%n | すでに出力した文字数を次の変数に格納 |
%o | 8進数 |
%p | ポインタ(16進数での値のアドレス) |
%s | 文字列 |
%u | 符号なし10進数 |
%u | 符号なし16進数 |
%X | %x と同じ |
|
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
my $yyyymmdd = sprintf("%02d.%02d.%02d", $year+1900, $mon+1, $mday);
my $week = sprintf("%s", ("Sun", "Mon", "Tue", "Wed", "The", "Fri", "Sat")[$wday]);
my $hhmmss = sprintf("%02d:%02d:%02d", $hour, $min, $sec);
print $yyyymmdd;
print '('.$week.')';
print $hhmmss;
↓
2006.04.20(Sat)18:43:12
|
chop(文末の1文字を削除)の例
|
chop($x); chop $x; のようにして使います。
↓のchompとほぼ同じです。Perlのバージョンが5になってchompが対応されるまでは同じ
ように改行コードの削除に使うことがあったかもしれませんが、\r\n の時でも \n しか
削らないので今はchompを使います。
単純に文字列を削りたい時向けです。
|
chomp(改行コードを削除)の例
|
chomp($x); chomp $x; のようにして使います。
注意すべき点は引数がそのまま処理されて戻り値には削除した個数がセットされます。
$y = chomp($x); とした場合、$y には削除した個数が入ります。$x は改行コードが
ぜんぶ削除された長〜い文字列データーになります。
|
s(文字の置き換え(正規表現))
|
$x =~ s/パターン/置き換える文字/オプション
|
#!c:/perl/bin/perl
print "Content-type: text/html; Charset=Shift_JIS\n\n";
$x = 'vvvーv・v−v';
$x =~ s/\w/ボ/g;
print $x;
↓
ボボボーボ・ボ−ボ
(\w は半角英数字を表す正規表現、g は繰り返し処理のオプション)
|
tr(文字変換)
|
$x =~ s/変換前文字/変換後文字/オプション
|
#!c:/perl/bin/perl
print "Content-type: text/html; Charset=Shift_JIS\n\n";
$x = 'abcabcabc'; # a か b か c → x
$x =~ tr/abc/x/;
print $x . '<br>';
$x = 'abcabcabc'; # a → x, b → y, c → 削除
$x =~ tr/abc/xy/d;
print $x . '<br>';
$x = 'abcabcabc'; # a以外 → x
$x =~ tr/a/x/c;
print $x . '<br>';
$x = 'abcabcabc'; # 変換後同じ文字が並んでいたら1つにする
$x =~ tr/abc/x/s;
print $x . '<br>';
↓
xxxxxxxxx
xyxyxy
axxaxxaxx
x
|
split(文字列分割)の例
|
@a = split /区切り文字/,$x;
$x(文字列)を区切り文字で切り裂きます。大抵は配列に格納されます。
|
#!c:/perl/bin/perl
print "Content-type: text/html; Charset=Shift_JIS\n\n";
my @x = split /、/,'最終日、東館、壁際';
print $x[0];
print $x[1];
print $x[2];
↓
最終日東館壁際
|
join(文字列結合)の例
|
$x = join '',@a;
split とは反対に配列を結合して文字列にします。
|
#!c:/perl/bin/perl
print "Content-type: text/html; Charset=Shift_JIS\n\n";
my @a;
$a[0] = 'Pathologically';
$a[1] = 'Eclectic';
$a[2] = 'Rubbish';
$a[3] = 'Lister';
$x = join ' ',@a;
print $x;
↓
Pathologically Eclectic Rubbish Lister
(病的折衷主義のガラクタ出力装置)
|
reverse(配列の順番を逆にします)の例
|
@x = reverse @y;
配列の中身の順番を反対にします。
これをハッシュでやるとキーと値が反転します。
|
#!c:/perl/bin/perl
print "Content-type: text/html; Charset=Shift_JIS\n\n";
my @x = ('アームストロング少佐','×','東方不敗');
print reverse @x;
print '<br>';
my %y = ('機動武闘伝Gガンダム'=>'ジーガン','鋼の錬金術師'=>'ハガレン');
%z = reverse %y;
print $z{'ジーガン'} . '<br>';
print $z{'ハガレン'} . '<br>';
↓
東方不敗×アームストロング少佐
機動武闘伝Gガンダム
鋼の錬金術師
|
crypt(暗号化)の例
|
crypt '文字(8バイト)','暗号化キー(2バイト)'
|
#!c:/perl/bin/perl
print "Content-type: text/html; Charset=Shift_JIS\n\n";
$x = crypt("12345678", "ab");
print $x;
↓
ab1iBa.N.U2C6
|
いじょうです。お疲れ様でした〜。
|
ところで月日を1月1日からの総日数で表すことをカイザーデートっていったと思うんで
すがググっても見つからりませんでした。私の記憶違いなのでしょうか。
(´・ω・`)誰か知りません?
|
|