出力: 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