出力: This is a pen Is that a pen--
@word = split (/ |\.|,|\"|\(|\)|\?|!/, 'This is a pen. (Is that a pen?)');
@word = sort @word; #@wordをソート
for ($i=0; $i<=$#word; $i++) { #@wordの要素を順に確認
if ($word[$i] eq '') { #もし$i番目の要素が空「''」(シングルクォート2個)なら
splice (@word, $i, 1); #その要素を削除
$i--; #削除分カウンターを1減
}
}
print "@word";
出力:
@word = split (/ |\.|,|\"|\(|\)|\?|!/, 'This is a pen. (Is that a pen?)');
@word = sort @word;
for ($i=0; $i<=$#word; $i++) {
if ($word[$i] eq '') {
splice (@word, $i, 1);
$i--;
} else { #この後から連想配列への代入処理
$assoc{$word[$i]}++; #%assocという連想配列のkey $word[$i]のvalueを1増
}
}
while (($key, $value) = each %assoc) { #each関数でkeyを$keyへ、valueを$valueへ格納
print "$key -> $\value\n";
}
出力:
@word = split (/ |\.|,|\"|\(|\)|\?|!/, 'This is a pen. (Is that a pen?)');
@word = sort @word;
for ($i=0; $i<=$#word; $i++) {
if ($word[$i] eq '') {
splice (@word, $i, 1);
$i--;
} else { #この後から連想配列への代入処理
$word[$i] =~ tr/A-Z/a-z/; #大文字を小文字に変換
$assoc{$word[$i]}++; #%assocという連想配列のkey $word[$i]のvalueを1増
}
}
@word=(); #@wordを再利用するため1度空にする(初期化)
while (($key, $value) = each %assoc) { #each関数でkeyを$keyへ、valueを$valueへ格納
push (@word, join(" -- ", $key,$value));
}
@word = sort @word;
foreach $yoso (@word) {
print $yoso, "\n";
}
出力:
#!/usr/local/bin/perl
$directory="data"; #目的のファイルがあるフォルダの名称
$file="wowcat\.txt"; #ファイルの名称。「\.」としてありますが\はなくてもほぼOK
$separator="\\"; #パスをつなぐ記号で、機種固有値(UNIX... / Mac... :)
$in=$directory.$separator.$file; #相対パスでファイルを指定
$out="wlist\.txt"; #出力ファイル
#区切り文字データ
$sep = "\\s|,|\\\"|\\(|\\)|\\?|!|;|:|\\\/|\\[|\\]";
#区切り文字例外マッチングパターン - 「.」の場合の例外処理
$dont="\[A-HJ-Z\]|M(r|s|rs)|Dr|Calif|V[Aa]|[MS][Tt]|Jan|Feb|Mar|Apr|Aug|Sep(t|)|Oct|Nov|Dec|Assoc|Co|Gov|Se(n|c)|Ont|i\\\.e|e\\\.g|v(s|)|Pa|Fla|Re(p|v)|Gen|Univ|Jr|[fF]t|[Ss]gt|[Pp]res|[Pp]rof|etc|al|[AaPp]\\\.[Mm]";
open (FILE, $in) || die "$in\n$!\n"; #ファイルオープン
while (<FILE>) { #ファイル内のデータ分繰り返し
@word=(); #配列@wordを初期化
$data = $_; #念のため$_を明示的に$dataに代入しています。
$data =~ s/\.{2,}/ /g; #「...」などの表現をスペースにしています。
#以下のブロックは「.」が文末に来た場合の例外処理と文末の「.」の削除処理
if ($data !~ /[^A-Za-z-'](($dont)\.)\s+$/){
$data =~ s/\.\n/\n/;
}
#ここは数字の処理 ... 22,569.233などを1語で出力
while (1) {
if ($data =~ /[^A-Za-z-'!\?]([\d\.,]+)[^A-Za-z-'!\?]/) { #数字列を検索したら
push (@word, $1); #それだけ先に@wordにプッシュし、
$data = $`." ".$'; #$dataを数字を抜いた文字列に書き換える
} else {
last;
}
}
@array = split($sep, $data); #文字列を$sepで分割し、@arrayに格納
foreach $yoso (@array) { #@arrayから1語ずつ@wordに格納
push(@word, $yoso); #これは数字の例外を処理するためだけのやや冗長な処理
}
#以下は空白要素を削除しながら語数をカウントするブロック
@word = sort @word;
for ($i=0; $i<=$#word; $i++) {
if ($word[$i] eq '') {
splice (@word, $i, 1);
$i--;
} else { #この後から連想配列への代入処理
$word[$i] =~ tr/A-Z/a-z/; #大文字を小文字に変換
$assoc{$word[$i]}++; #%assocという連想配列のkey $word[$i]のvalueを1増
}
}
}
close FILE; #ファイルのクローズ
@word=(); #@wordを再利用するため1度空にする(初期化)
#$totalで総語数もカウント
$total=0;
while (($key, $value) = each %assoc) { #each関数でkeyを$keyへ、valueを$valueへ格納
push (@word, join("\t", $key,$value)); #key(TAB)valueという要素に変換して配列へ格納
$total+=$value; #総語数計算
}
@word = sort @word; #alphabetical orderにするためのソート
open (FILE, "> $out") || die "Can't create $out\n$!\n"; #出力ファイルオープン
foreach $yoso (@word) {
print $yoso, "\n"; #結果を出力
print FILE $yoso, "\n"; #結果をファイルへ出力
}
print "\ntotal... $total\n"; #総合計表示
print FILE "\ntotal... $total\n"; #総合計をファイルへ出力
close FILE;
exit (0);
--
@num=(1,11,5,9,36,52,74,499,23,33,876,87,99,6,7,8);
@num=sort @num;
foreach $yoso (@num) {
print $yoso, "\n";
}
print "--\n";
@num=sort numeric @num;
foreach $yoso (@num) {
print $yoso, "\n";
}
sub numeric {$a<=>$b;}
出力:
sub my_alphabetical
{
$aa=$a;
$aa =~ tr/[A-Z]/[a-z]/;
$bb=$b;
$bb =~ tr/[A-Z]/[a-z]/;
$cp=$aa cmp $bb;
if ($cp == 0) {$cp=$a cmp $b;}
return $cp;
}
$cp = $bb <=> $aa;
if ($co == 0) {
$cp = $aa cmp $bb;
if ($cp == 0) {$cp = $a cmp $b;}
}
return $cp;
スクリプト全体...wordlist.pl