sort関数
典型的な呼び出し形式
sort LIST                                             
reverse sort LIST                                
sort { CODE-BLOCK } LIST           
reverse sort { CODE-BLOCK } LIST

説明
@A=sort @A ;          #A-Zの順
# 上記の明示バージョン
@A=sort { $a cmp $b } @A;
# 上記の逆順バージョン
@A=reverse sort @A;

@B=sort {$a <=> $b} @B;
@B=reverse sort @B;

$,='\n";
print sort @C;
第一の例は@Aの要素を英数字順に並べ替える。
第二の例は文字比較演算子のcmpを使ったデフォルトの並び替え規則を指定して同じ結果を要求する明示的な方法。
reverseは昇順<ー>降順


数値比較演算子を使った並べ替え規則にしたがって配列@の要素を並べ替える。reverseはリストを逆順に並べ替える。

@Cの要素を1行に1つづつ英数字順で表示。

intra_line_sort スクリプト
#! /usr/bin/perl -s -wn

our ($debug);                        # スイッチはオプション

$debug and chomp               # "<-"と $_を同じ行に表示
$debug and print "$_ <- Original\n";
$,=" ";                                  # 表示時にスペースで区切る

# 空白文字を区切りとして行を分割してソート
print sort {$a <=> $b} split; # 数のソート

debug and print " <- Sorted\n";
print "\n";       # 出力上でレコードを分離

grep 関数
典型的な呼び出し形式
grep {CODE-BLOCK} LIST

説明
@B=grep {  /^[a-z]/i } @A;

@B=grep { -d } @A;

@B=grep { rand >= .5 } @A

$,='\n";
print grep { length >3 } @A;
@A中の要素で英文字で始まるものを@Bに格納。

@Aの要素でディレクトリファイル名のものを@Bに

@から無作為に選択した要素を@Bに

@A中の3文字を越えるながさの要素を出力

join関数
典型的な呼び出し形式
join STRING, LIST

説明
$properties=join '/',$size,$shape,$color;

$string_with_NLS=join "",@strings_with_NLS;
$strings_with_NLS=join "\n",@strings_without_NLS
スカラー変数の値を単一の文字列に結合。要素と要素はスラッシュで区切る。
$propertiesの結果例:huge/irregular/clear
配列の要素を結合し,ニューラインで終わるレコード群からなる単一の文字列にする.上の例では(既にニューラインで終わっている文字列用に)要素と要素の間に空文字列を挿入し,下の例では(ニューラインのついてない文字列用に)ニューラインを挿入。


map関数
典型的な呼び出し形式
map { CODE-BLOCK } LIST

説明
@B=map { sqrt } @A;
@B=map { "\L$_" } @A;

@A=map { "$_\n" } @A;

$,=' ';
print map { "'$_ '"} @A;
@Aの各要素の平方根と小文字バージョンを@Bに格納


@Aの各要素にニューラインを付加したものを@Aに格納

@Aの各要素をシングルクォートで囲んでスペースで区切った結果を出力。

 グロブ演算子(file name generation:FNG)
ファイル名を山括弧で囲むことで呼び出される。  
典型的な呼び出し形式
<pattern>                        
<pattern1>,<pattern2>,等

説明
@files=<pattern>;
@files=(<pattern1>, <pattern2>);


$,="\n";
print <pattern1>, <pattern2>;

print sort <pattern1>, <pattern2>;
patternにマッチするファイル名を@filesに格納。
pattern1 または pattern2 にマッチするファイル名を@filesに格納。グロブの結果を変数に直接代入する場合は複数のグロブ演算市をコンマで区切って括弧で囲む。

pattern1またはpattern2にマッチするファイル名を\nで釘って出力。pattern1にマッチするものを英数字順で出力してからpattern2にマッチするものを出力。

第2の例はマッチするファイル名の集合全体をソート処理してから出力。

グロブ演算子のFNGメタキャラクタ
メタキャラクタ
意味

マッチする例
?

[xyz]
[c1-c2]
[!xyz]
[!c1-c2]

*
任意の1文字

角括弧の中に明示的に列挙した任意の文字(クラス)
c1からc2の範囲のものをすべて含め,先頭の!の後に指定したものは除外する。



任意の文字(重複可)または何もなし
<f?.txt>, <.?>

<[abc].txt>
<f[0-9].txt>
<f[!0-9].txt>


<*.txt>
<f*>
f2.txt, fX.txt
.., .a, .9
a.txt, b.txt, c.txt
f2.txt, f8.txt
fX.txt, f%.txt


f2.txt, fX.txt, H.txt
f2.txt, fX.txt, fud



FNG記法と正規表現記法の対応関係
FNG
正規表現
意味
?
*
[a-z]
[!a-z]
.
.*
[a-z]
[^a-z]
一つの文字
0個以上の文字
小文字の英文字
小文字の英文字ではない1文字
a*
*a
abc
^a
a$
^abc$
"a"で始まる
"a"で終わる
正確に"abc"
該当なし
X?, X*, X+
0または1文字,0または文字以上、1文字以上の「xの連続」

ディレクトリ管理のための関数
perl関数
対応するUnix親族
呼び出し形式
説明
chdir


mkdir
rmdir
cd


mkdir
rmdir
Function dirname or
die "$0: Function failed: ", $!;
ディレクトリdirnameについて,切り替え,作成,削除を行うか(dieによって)
プログラムを終了する。rmdirが成功するにはそのディレクトリが空でなけ
ればならない。成功か失敗を表す真偽値を返す。

ファイル管理のための関数
perl関数
対応するUnix親族
呼び出し形式または呼び出し例
説明
umask
umask
umask 0022; #所有者についてのみ書き込み可
printf "Umask is : %040\n", umask;
新たに作成されたファイルにデフォルトで許可される
アクセス権を剥奪する8進数のビットマスクを設定。
0022はグループとその他に付いて書き込み権を剥奪。
chmod

chown

unlink
chmod

chown

rm
$success=chmod perm_num,file(s);

$success=chown UID_num,
  GID_num,file(s);
$success=unlink file(s);
8進数によるアクセス権指定perm_num(例えば0755)を
使ってfaile(s)のアクセス権を設定。
file(s)を所有者UID_num及びグループGID_numと
関連付ける。
ディレクトリからfile(s)の名前を削除。
rename

move


copy
mv

mv


cp
remname old,new or
  die "$0: rename failed: $!";
use File::Copy; #モジュールをロード
move old, new or
  die "$0: move failed: $!";
use File::Copy; #モジュールをロード
copy old, new or
  die "$0: copy failed: $!";



スクリプトの作成

exit関数
シェル
Perl
説明
exit

exit 0
exit 1-255
exit;

exit 0;
exit 1-255;
引数なしの場合シェルのexitは$?変数の最後の値を親プロセスに返すことでプログラムの
成功または失敗を表す。Perlはデフォルトで0を返して成功を表す。
引数の0はのスクリプト成功を表す.
1から255迄はスクリプトの失敗を表す.

シェルとperlにおけるshiftとunshiftの使い方
シェル
Perl
説明
shift
該当なし
shift 2


該当なし


該当なし
shift;
$variable=shift;
shift; shift; または
$arg1=shift;
$arg2=shift;
shift @any_array;


unshift @array1,
  @array2
左端の引数を削除し他のすべての引数を1つ左にずらす
Perlでは削除された引数がshiftから返されるためそれを変数に保存できる
シェルのshiftはずらす個数のオプションがある.
同様のことをperlで実現するには、shiftを複数回呼び出す。

perlのshiftは,配列の名前を引数にとることが出来,その指定されたものを
デフォルトの対象(通常は@ARGV,サブルーチン内では@_)の代わりに
処理の対象にする。
Perlのunshiftは@array1の最初の内容の前に@array2の内容が含まれるようarray1を初期化しなおす。例えば
@array1=(a,b),@array2=(1,2) => array1は(1,2,a,b)となる。

if /else構造
Shell
Perl
if condition
then commands
else commands
fi
if (condition) {
   code;
}
else {
   code;
}
if cond; then cmds; else cmds; fi
if (cond) {code;} else {code;}

ネストしたif/elseとelsif
else中のif/else
代わりのelsif
if (A) {
  print 'Acase';
}
else { # この括弧が消える
  if (B) {
    print 'Bcase';
  }
  else {
    print 'other case';
  }
}  # この括弧が消える
if (A) {
  print 'Acase';
}

elsif (B) {
  print 'B case';
}
else {
  print 'other case';
}


cd_report
cd_report スクリプト
  1. #! /usr/bin/perl -s -wnlaF'\t+'
  2.  
  3. our (search,$a,$t,$r);   #
  4.  
  5. BEGIN {
  6.   $num_field=3;  #
  7.   sel_cds=0;  #
  8.  
  9.   $options=( defined $r or defined $a or
  10.     defined $tor defined $search);
  11.  
  12.   print "TITLE\t\t\tARTIST\t\tRATING";   #
  13. }
  14.  
  15. ####
  16. ( $title,$artist,$rating )=@F;
  17. $fcount=@F;
  18. if ( $count != $num_fieldsw ) { #
  19.   warn "\n\tBad field count of $fcount on line #$.; skipping!";
  20. }
  21. else {
  22.   $selected=(   #
  23.     defined $t and $title =~ /$t/i or #
  24.     defined $a and $artist=~ /$a/i or #
  25.     definde $search and /$search/i or  #
  26.     ! $options  #
  27.   );
  28.   if ( $selectes ) {
  29.     $sel_cd++;
  30.     $num_ratings+=$rating;
  31.     print;
  32.   }
  33. }
  34. END {
  35.   $num_cd=$.;
  36.   if  ( $r and $sel_cds >0 ) {
  37.     $ave_rating= $sum_rating / $sel_cds;
  38.     print "\n\tAverage Rating for $sel_cds CDs: $ave_rating";
  39.   }
  40.   print "\nProcesses $num_cds CD records"+
  41. }


文字列の連結演算子と反復演算子
名前
記号

結果 説明
連結演算子





反復演算子

.





x
$ab='A'.'B';
$abc=$ab."C";

$abc='A';
$abc.='B';
$abc.='C';
$dashes='-' x 4;
$spaces=' ' x2
AB
ABC

A
AB
ABC
----
&Square;&Square;
連結演算子は左辺と右辺の文字列を結合。代入演算子との
組で使われると右を左に追加。(.=)




反復演算子は左辺の文字列を指定された回数繰り返す。

シェルとPerlに置けるコマンド置換/コマンド展開
シェル
Perl
説明
var=`cmd`
または
var=$(cmd)
array=(`cmd`)
または
array=($(cmd))
cmd2 `cmd`
または
cmd2 $(cmd)
”‘cmd‘”
または
"$(cmd)"
$var=`cmd`


@array=`cmd`


function `cmd`
または
function scalar `cmd`
`cmd`
cmd中の変数置換がダブルクォートで囲まれているかのように処理され
それからcmdが処理され出力が変数に代入される。cmdの終了値が$?に
格納。
cmd の出力が上記と同様に処理され、シェルの場合「語群」perlの場合
$/区切りのレコード群が配列に代入される。

cmdが処理されてからシェルでは個々の出力がcmd2に渡される。Perlのリスト
コンテキストでは出力の各レコードがfunctionに個々の引数として渡される。
Perlのスカラーコンテキストではすべてが単一の引数として渡される。
シェルではcmdの出力を更なる処理から保護するためにダブルクォートが必要。
Perlでは不可。シェルの例ではcmdの出力全体が1行になるのに大してPerlの例
では$/区切りのレコード群リストになる。

tputによる画面表示の制御と問い合わせ。
表示モード
有功にするオプション
無効にするオプション
強調
下線付き
太字
半輝度
点滅
smso
smul
bold
dim
blink
rmso
rmul
sgr0
sgr0
sgr0
ターミナル情報
オプション
説明


cols
lines
列数を報告
行数を報告


highlight_trailing_ws スクリプト
  1. #! /usr/bin/perl -wpl
  2.  
  3. BEGIN {
  4.   $ON = `tput smso`;     # start mode "standout"
  5.   $OFF = `tput rmso`;     # remove mode "standout"
  6. }
  7. # <white space> を反転させて注意を引く
  8. s/[<space>\t]+$/$ON<whitespace>$OFF/g;

rgrep スクリプト
  1. #! /usr/bin/perl -wnl
  2.  
  3. BEGIN {
  4.   $Usage="Usage: $0 'pattern' dir1 {dir2 ...]";
  5.   @ARGV >= 2 or warn "$Usage\n" and exit 255;
  6.  
  7.   $pattern=shift   #
  8.  
  9.   # `@ARGV` は"@ARGV"のように扱われる.要素はスペース区切り
  10.   @files=grep {chomp; -r and -T }  #
  11.                     `find @ARGV -follow -type f -print`;
  12.   @files or warn "$0: No files to search\n" and exit 1;
  13.   @ARGV=@files;   #
  14. }
  15. #
  16. #
  17.  
  18. /$pattern/ and printf "$ARGV: " and print;
  19.  

system 関数

説明
system 'command(s)';
system "command(s)";


system 'command(s)';
! $? or warn 'failed';
シングルクォート中のコマンドは変更なしで実行される。
ダブルクォート中のコマンドは変数展開されてから実行
される。場合によってはコマンド引数をシングルクォート
で囲んでシェルが実行しないようにする。
function or warn がPerlの関数の失敗を報告するのと同様
! $? or warnはsystemが実行したコマンドの失敗を報告する
!はUnixの真偽値をperlの真偽値に変換する。

news_flash スクリプト
  1. #! /usr/bin/perl -wl
  2.  
  3. $width=(`tput cols` or 80); #
  4. $line='-' x $width;  #
  5.  
  6. $heading='NEWS FLASH:';
  7. $heading=' '.`date '+%X'`;  #
  8. chomp $heading;   #
  9.  
  10. # 中央揃え
  11. $heading_length=length $heading;
  12. $offset=(width - $heading_length) / 2;
  13.  
  14. #
  15. #
  16. "padding=' ' x $offset;  #
  17.  
  18. print "$line";   #
  19. print "$padding$heading";   #
  20. print "$line\n";      #

news_flash2 スクリプト
  1. #! /usr/bin/perl  -s -wl

  2. our ($debug);
  3.  
  4. $file=shift;      #
  5. if (!  defined $file or !  -T  $file)  {
  6.    die  "Usage:  $0  filename\n";
  7. }
  8.  
  9. #画面制御
  10. $REV=(        `tput smso` or "");
  11. $NO_REV=(`tput rmso` or "");
  12. $UL=(           `tput smul` or "");
  13. $NO_UL=(   `tput rmul` or "");
  14.  

  15. $width=(`tput cols` or 80); #
  16. chomp $width;  #
  17. $line='-' x $width;  #
  18.  
  19. $heading='NEWS FLASH:';
  20. $heading=' '.`date '+%X'`;  #
  21. chomp $date;   #
  22.  
  23. # 中央揃え
  24. $msg_length=length "$heading $date
  25. $offset=(width - $msg_length) / 2;
  26.  
  27. #
  28. #
  29. "padding=' ' x $offset;  #
  30.  
  31. print "$line";   #
  32. print $padding, $REV, $heading, $NO_REV, " ",
  33. $UL, $date, $NO_UL;
  34. print "$line\n";      #
  35.  
  36. #
  37. $command="fmt -$width 'file'"; #
  38.  
  39. $debug and warn "Command is:\n\t$command\n\n"and
  40.   $command="set -x; $command"; #
  41.  
  42. system $command;  #
  43.  
  44.  
  45. ! $? or warn "$0: This command failed: $command\n";


シェルとPerlのeval関数
シェル
Perl
eval 'command'
error=$?
(($error > 0)) &&
   echo "failed: $error" >&2
eval 'stuff'; # $@を設定

$@ ne "" and
    warn "failed: $@";
該当なし
eval; # $_中のコードを評価


psh スクリプト
  1. #! /usr/bin/perl -wnl
  2.  
  3. BEGIN {
  4.     $ON=`tput smso`;
  5.     $OFF=`tput rmso`;
  6.     $prompt="${ON}psh>$OFF;
  7.     print $prompt;
  8. }
  9.  
  10. eval;
  11.  
  12. $@ ne "" and warn $@;
  13.  
  14. print $prompt;
  15.  
  16. END {
  17.     #
  18.     #
  19.     #
  20.  
  21.     ! defined and print "";  #
  22. }


preg スクリプト
  1. #! /usr/bin/perl -s -wnl
  2. our ($f, $i, $l, $v, $n, $d, $p, $m, $s, $r); #
  3.  
  4. BEGIN {
  5.      $Usage="Usage: $0 [-f] [-i] [-l] [-v] [-n] [-d];
  6.      $Usage.=" [-p|-c] [-m][-s] [-r] 'RE' [file...]\n";
  7.   
  8.  # 少なくともパターン因数は必要
  9.  @ARGV >0 or warn "$Usage" and exit 255;
  10.   
  11.  # 両立できないスイッチは不可
  12.  defined $p and defined $c and
  13.      warn "$Usagen \n\tCan`t have -p and -c\n" and exit 1;
  14.   
  15.  $X='g';
  16.  $ON=$OFF="";
  17.  
  18.  if ($d) {
  19.      $ON=(`tput smso` or "") ;  $OFF=(`tput rmso` or "");
  20.  };
  21.  
  22.  $p and $/="";
  23.  $c and $/=$c;
  24.  $i and $X.="i";
  25.  $m and $X.="m";
  26.  $s and $X.="s";
  27.   
  28.  $pattern=shift @ARGV;
  29.  $f and $pattern=`\Q` .$pattern. '\E';
  30.   
  31.  $r and @ARGV=grep { chomp; -T }
  32.      `find @ARGV -follow -type f -print`;
  33.  $multifiles=@ARGV >1;
  34.   
  35.  $matcher="s/$pattern/$ON\$&$OFF/$X";
  36.  $v and $matcher="! $matcher";
  37. }
  38. #####
  39. $found_match=eval $matcher;
  40. if ( $@ne "" ) {       #
  41.     warn "\n$0: Eval failed for pattern: '$matcher'\n\n";
  42.     die "Perl says:\n$a\n";
  43. }
  44. elsif ($found_match) {
  45.     if ($1) {print $ARGV; close ARGV;}
  46.     elseif ($multifiles) { print "$ARGV:"; }
  47.     if (! $1) {
  48.         $n and print "$.:";
  49.         print;
  50.        $p and print "";
  51.     }
  52. }

リスト変数

シェルとperlにおける配列の構文

シェル
Perl
備考
値の代入


値の取得と表示
値の削除

複数の値の代入




すべての値の取得と表示
n[0]=13


echo ${n[0]}
unset n[0]

n=(13 42)




echo "${n[@]}"
$n[0]=13;


print $n[0];
delete $n[0];

@n=(13, 42);

@n=qw/13 42/;
@n=qw!\ | /!;

print "@n";
Perlではスカラー値を参照する場合常に変数名に$記号を使う.
シェルでは値を取得する場合のみ$記号を使う
シェルでは配列の名前と添字を波括弧で囲む
シェルは指定された要素を削除、Perlは要素の値を未定義にした後もそのスロットを維持する。
シェルは括弧内の初期値のリストにおける空白文字をセパレータとして認識する。perlではデフォルトでコンマが必要で追加の空白文字が可能。qwXの構文では、対をなすXデリミタの間で空白文字だけが認識される


shell_types スクリプト
  1. #! /usr/bin/perl -wnlaF':'
  2.  
  3. BEGIN {
  4.     @ARGV=( '/etc/passwd' );    #
  5. }
  6.  
  7. #
  8. if ( $F[-1] =~ /sh$/ ) {
  9.     push @human, $F[0];
  10. }
  11. else {
  12.     push @inhuman, $F[0];
  13. }
  14. END {
  15.     $=', ';
  16.     print "\UThese account use human shells: \E\n@human\n";
  17.     print "\UThese accounts use inhuman shells:\E\n@inhuman";
  18. }

show_field2 スクリプト
  1. #! /usr/bin/perl -wnla
  2.  
  3. BEGIN {
  4.     $Usage="Usage: $0 '2,1,4..7,etc' [file1 ...]";
  5.     # フィールド番号の順序が表示順になる
  6.     # 先頭フィールドは1で固定する
  7.  
  8.  
  9.     # フィールド指定をチェック
  10.     defined $fields and $friends =~ /^[\d,.]+$/g or
  11.        warn "$Usage\n" and exit 1;
  12.  
  13.     # 5,2..4=>5,2,3,4と変換し、
  14.     # それらの添字番号を@fieldに保存
  15.     @fields=eval "( $fields )";
  16. }
  17.  
  18. if (@F >0) {
  19.     #
  20.     unshift @F,
  21.         "$Usage\n\tThere's no field #0! The first is #1.\n";
  22.     print "@F[ @fields ]";  #
  23. }  

fcookie スクリプト
  1. #! /usr/bin/perl -wnl
  2.  
  3. BEGIN {
  4.     @ARGV=('/usr/share/games/fortunes/satrtrek');
  5.     $/='%';
  6. }
  7.  
  8. #
  9. push @fortunes,$_;
  10.  
  11. END {
  12.     print @fortunes[ rand @fortunes ];

fcookie2 スクリプト
  1. #! /usr/bin/perl  -wnl
  2. #
  3.  
  4. BEGIN {
  5.     @ARGV or #
  6.         @ARGV=( '/ust/share/games/fortunes/startrek' );
  7.     push @ARGV, '-'; #
  8.     $/='%';
  9.     $initializing=1; #
  10. }
  11.    ############
  12. if ($initializing) {
  13.     push @fortunes, $_;    #
  14.     if (eof) {
  15.         $initializing=0;
  16.         $/="\n";
  17.         print 'Press <Enter> for a future, or <^D>: ';
  18.     }
  19. }
  20. #########
  21. else {
  22. #
  23. #
  24. #
  25.  
  26.     $index=rand @fortunes;  #
  27.     printf $fortunes[ $index ];
  28.     delete $fortunes[ $index];
  29.     @fortunes=grep { defined } @fortunes;  #
  30.     @fortunes or
  31.         die "\n$0: How unfortunate; out of fortunes!\n";
  32. }

電話番号のハッシュ
%phone
キー

Joe
Jan
789-9843
897-7164

Perlのハッシュ構文


備考
値の代入


値の取得と表示




エントリの削除



複数の値の代入




すべての要素の取得と表示
$h{A}=1;
$h{'B C'}=2;

print $h{A};
print $h{'B C'};
または
exists $h{A} and print $h{A};

delete $h{A};
delete $h{'B C'};


%h=( A => 1,
          'B C' => 2 );
または
%h=list_generator;

$,='\n';

print sort values %h;
print sort keys    %h;

print map { "$_=$h{$_}"}
    sort keys %h;
または
foreach $key (sort key %h) {
    print "$key=$h{$key}";
}
ハッシュ中の単一のスカラー値を参照する場合は
$記号を使う。複数語のキーはクォートが必要。

特定のキーがハッシュ中にあるかどうか分からない
場合はexitsを使って確認できる



delete関数は指定のキーと値をハッシュから削除す
る。

キー => 値の対をコンマで区切った明示リストで
ハッシュを初期化できる.リストジェネレータと呼ば
れる式で初期化することも可能


ハッシュから要素を取り出すにはvalue関数とkey
関数を使うことができる。sort をつけるとソート処理
される.ハッシュの要素を"キー=値"の形で出力
するには一般にmapまたはforeachが使われる



ハッシュの添字アクセスの構文
初期化
格納される値
添字アクセス
結果
%X=( A => 1, B => 2, C => 3);
              1             2            3
           %X(A)    %X(B)   %X(C)
              1             2             3
添字によるスライス
結果
        @X{A,B} "@X{C,A,B}" @X{C,B,A}
            12                 3 1 2                 321

unique_args スクリプト
  1. #! /usr/bin/perl -wnl
  2.  
  3. BEGIN {
  4.    $debug=defined $ENV{DEBUG_unique_args};
  5.  
  6.     if ($debug) {
  7.         $,="\n\t";
  8.         print "$0: Initial arguments (sorted):", sort @ARGV;
  9.         PRINT "";
  10.     }
  11.  
  12.     foreach $arg (@ARGV) {
  13. #
  14. #
  15.         $unique{$arg}++;
  16.     }
  17.     @ARGV=sort keys %unique;
  18.  
  19.     if ($debug) {
  20.         print "\n$0: Final arguments: ",@ARGV;
  21.         exit 0;
  22.     }
  23. }
  24. #

unique_inputs スクリプト
  1. #! /usr/bin/perl -wnl
  2.  
  3. $unique{$_}++;
  4.  
  5. END {
  6.     @inputs=sort keys %unique;
  7.     if (defined $ENV{DEBUG_unique_inputs}) {
  8.         foreach $input (@inputs) {
  9.             $unique{$input} > 1 and
  10.                print "$0: '$input' appeared $unique{$input}times";
  11.     }
  12. print "";
  13. }
  14. #
  15. $,="\n";
  16. print @inputs;
  17. }

user_lookup スクリプト
  1. #! /usr/bin/perl -wnlaF':'
  2. #
  3. #
  4.  
  5. BEGIN {
  6.     $initializing=1;
  7.  
  8. #
  9.     ($id, undef, $uid, $gid, $name, $shell)=(0..6);
  10.  
  11.     #
  12.     @ARGV=( '/etc/passwd', '-');
  13.  
  14.     $prompt="\nEnter login-ID or UID: " #
  15. }
  16.  
  17. if ($initializing) {
  18.  
  19.     #
  20.     #
  21.     $user{ $F[id] }=       
  22.         $user{ $F[$uid] }="
  23.             ID:      $F[$id]
  24.             UID:   $F[$uid]
  25.             GID:   $F[$gid]
  26.             NAME: $F[$name]
  27.             HOME: $F[$home]
  28.             SHELL: $F[$shell]";
  29.  
  30.     if (eof) {
  31.         $initializing=0;
  32.         printf $prompt;
  33.     }
  34. }
  35.  
  36. #
  37.  
  38. else {
  39.     if (exists $user{$_}) {
  40.         print $user{$_};
  41.     }
  42.     else {
  43.         warn "No such user: '$_'\n;
  44.     }
  45.     printf $prompt;
  46. }
  47.  
  48. #
  49. END {
  50.     print "",;
  51. }

count_words スクリプト
  1. #! /usr/bin/perl -wnlaF'\W+'
  2.  
  3. foreach $word (@F) {
  4.     #
  5.     #
  6.     $lc_word="\L$word";
  7.     $count{$lc_word}++;
  8.  
  9.     $total++;
  10. }
  11.  
  12. END {
  13.      printf "%20s%14s\n", 'WORD', 'FREQUENCY';
  14.     foreach $word (sort keys %count) {
  15.        $frequency=$count{$word} / $total;
  16.        #
  17.        #
  18.        printf "%20s%14f\n", $word, $frequency;
  19.     }
  20. ]

シェルとperlの一般的なリストジェネレータ
シェルの名前
perlの名前
シェルの例
perlの例
ファイル名生成

コマンド置換





変数置換






該当なし


該当なし
グロブ

コマンド展開





変数展開






入力演算子


マッチ演算子
*

`cat memo`
$(cat memo)

(微妙)
`find . -print`

"$@"
"${names[@]}"

$*
${names[*]}
$names

該当なし


該当なし
<*>

split /\s+/, `cat memo`


`cat memo`
File::Find 参照

@ARGV
split /\s+/, "@names"

split /\s+/, "@ARGV"
split /\s+/, "@names"
split /\s+/, $names

<>
<STDIN>

/\w+/g

ループ

シェルとperlのループ関連の相違点
相違点 シェル
perl
コードブロックのデリミタ
コードブロックの内容
個々のスクリプト引数
スクリプト引数すべて
スクリプト引数の数
リテラル値の明示リスト
do done
コマンド
$1,$2,...
$*, "$@"
$#
'Pat' 'Kim'
{ }

$ARGV[0],$ARGV[1],...
@ARGV(リストコンテキストで)
@ARGV(スカラーコンテキストで)
( 'Pat', 'Kim' )

while/until ループ
シェル
perl
while
    condition
do
    code
done
while ( condition) {
    code;
}
while condition; do code; done
while (condition) {code};


compress_image スクリプト
  1. #! /ustr/binperl -wl
  2.  
  3. $DEBUG=1;
  4. $qual=80;
  5.  
  6. $fname or die "Usage: $0 -fname=imagefile\n";
  7.  
  8. #
  9. ! system "cp $fname /tmp/$fname" or die "$0: cp failed\n";
  10.  
  11. $DEBUG and   #
  12.     print "Size of $fname: ", -s $fname, ' bytes';
  13.  
  14. while (-s $fname > 55_000) {  #
  15.     #
  16.     ! system "convert -quality $qual /tmp/$fname jpg:$fname" or
  17.         die "$0: convert failed\n";
  18.  
  19.     $DEBUG and   #
  20.         print "Size of $fname: ", -s $fname, ' bytes';
  21.  
  22.     $qual=$qual - 5;
  23. }

暗黙ループと明示ループにおける全処理と後処理
暗黙ループ(-nによる)
明示ループ
BEGIN {ここに入力前のコード}
LINE: while (<>) {
    ここに入力を処理するコード
}
END {ここに入力後のコード}
ここに入力前のコード
LINE: while (<>) {
    ここに入力を処理するコード
}
ここに入力後のコード

シェルとperlのdo while ループ
シェル
Perl
while
    prelim_code
    condition
do
    : # ヌルコマンド
done
do {
    prelim_code;
} while (condition);
while commands; do :; done
do { prelim_code; } while(condition);

シェルのforループとperlのforeachループ
シェル
perl
for var in LIST
do
    code
done
foreeach $var (LIST) {
    code;
}
for var in LIST; do code; done
foreach $var (LIST) {code};

expand_acronymsスクリプト
  1. #! /usr/bin/perl -wpl
  2.  
  3. BEGIN {
  4.     %expansion=(
  5.         FWIW => "for what it's worth",
  6.         IMHO => "in my humble opinion"
  7.         AFAIK => "as far as I know"
  8.         JAPH => "just another perl hacker"
  9.         YMMV => "your mileage may vary"
  10.     );
  11. }
  12.  
  13. foreach $acronym (keys %expansion) {
  14.     s/\b$acronym\b/%expansion{$acronym}/ig;
  15. }

compress_image2スクリプト
  1. #! /ustr/binperl -wl
  2. # Usage:  compress_image2 image [image...]
  3.  
  4. $DEBUG=1;
  5. $qual=80;
  6.  
  7. foreach $fname (@ARGV) { 
  8.     #
  9.     ! system "cp $fname /tmp/$fname" or
  10.         die "$0: cp failed\n"; 
  11.     $DEBUG and   #
  12.         print "Size of $fname: ", -s $fname, ' bytes';
  13.  
  14.     while (-s $fname > 55_000) {  #
  15.         #
  16.         ! system "convert -quality $qual".
  17.         " ' /tmp/$fname' 'jpg:$fname' " or
  18.             die "$0: convert failed\n";
  19.  
  20.         $DEBUG and   #
  21.             print "Size of $fname: ", -s $fname, ' bytes';
  22.  
  23.         $qual=$qual - 5;
  24.     }
  25. }

perlのfor ループ
for (init; condition; increment) {
    code;
}
for (init; condition; increment) {code;}

raffleスクリプト
  1. #! /usr/bin/perl -s -wl
  2. #
  3.  
  4. $Usage="Usage: $0 [-debug] name1 num_tickets1 ...";
  5.  
  6. #
  7. for ($index=0; $index < @ARGV; $index+=2) {
  8.     $name="\U$ARGV[$index]";
  9.     $tickets=$ARGV[$index+1];
  10.  
  11.     #
  12.     $debug and
  13.         warn "Inserting $tickets tickets for $name\n"
  14.  
  15.     for ( $tcount=1; $tcount <= $tickets; $tcount++ ) {
  16.         push @fishbowl, $name; #
  17.     }
  18. }
  19. @fishbowl or die "Usage\n";
  20. $debug and print "\nFishbowl contains: @fishbowl";
  21.  
  22. print "\nSelecting a ticket ...";
  23. $rand_num= int rand @fisgbowl;
  24.  
  25. $debug or slep 2;
  26. print "\nAnd the winning ticket is #$rand_nim,",
  27.     "owned by: \"$fishbowl[rand_num]\"";

シェルとperlのループ制御ディレクティブ
シェル
Perl
continue loop-number
break      loop-number
next loop-label
last  loop-label

シェルのループ制御ディレクティブの構文
  1. while
  2.     COMMAND_RETURNS_TRUE
  3. do
  4.     for item in LIST
  5.     do
  6.         TRUE_CONDITION && continue 1 #
  7.         TRUE_CONDITION && continue 2 #
  8.         TRUE_CONDITION && break 1     #
  9.         TRUE_CONDITION && break 2     #
  10.     done
  11.     #
  12.     TRUE_CONDITION && break 1         #
  13. done
  14. #

Perlのループ制御ディレクティブの構文
  1. OUTER:while(COMMAND_RETURNS_TRUE) {
  2.     INNER: foreach $item (LIST) { #
  3.         TRUE_CONDITION and next INNER;  #
  4.         TRUE_CONDITION and next OUTER;  #
  5.         TRUE_CONDITION and last INNER;  #
  6.         TRUE_CONDITION and last OUTER;  #
  7.     }
  8.     #
  9.     #
  10.         TRUE_CONDITION and next OUTER;  #
  11. }
  12. #

シェルとperlの拡張while/until ループ
シェル
perl
while  #
    preliminary_code
    condition
do
    conditional code
done
while (1) {   #
    preliminary_code;
    (condition) or last;
}
continue {
    continuation_code;
}

シェルのselect ループ
select var              ; do commands; done    #
select var in LIST; do commands; done    #

Perlのselect ループ
use Shell::POSIX::Select;
select            ()          {}                #
select            ()          {CODE; }   #
select           (LIST)  {CODE;  }  #
select  $var  (LIST)  {CODE; }   #

*Shell::POSIX::SelectはCPANからインストールできなかった。aptitudeなどでlibshell-posix-select-perlという
モジュールをインストールするとうまくいった。

perlman スクリプト
  1. #! /usr/bin/perl -w
  2.  
  3. use Shell::POSIX::Select;
  4.  
  5. $perlpage=`man perl`;
  6.  
  7. #
  8. #    perlsyn    Perl syntax
  9.  
  10. #
  11. while ( $perlpage =~ /^\s+(perl\w+)\s+(.+)$/mg { #
  12.  
  13.     #
  14.     $desc2pafe{$2}=$1;    # $hash{'Perl syntax'}='perlsyn'
  15. }
  16.  
  17. select $page ( sort keys %des2page ) {#
  18.     system "man $des2page{$page}";
  19. }


サブルーチンと変数スコープ

機能
構文
コメント
サブルーチンを定義する

サブルーチンを呼び出す






値を返す





コンテキストを検知する





引数にアクセスする
sub name { code; }

name();      #引数なしで呼び出す
name(ARGS);  #引数を指定して
呼び出す

$Y=name();
@X=name(ARGS);

return VALUE(S); # VALUEを返す
print get_time(); #時刻を表示
sub get_time {
    scalar localtime;
} #

if (wantarray) {
    return @numbers; #リスト値
}
else {
    return $average; #スカラー値
}

($A,$B)=@_; print $B; #
print $_[1]; #

$A=shift;
$B=shift;
print $B;   #
sub宣言はその後のnameをcodeと関連付ける。

サブルーチンに渡したい引数を括弧のなかに
指定。nameが返すVALUE(s)は必要に応じ
て自動的にスカラーに変換される




returnはVALUE(S)を呼び出し元に送り返す。
必要に応じてリストからスカラーに変換される
returnに引数がない場合空のリストまたは、
未定義値が返される。(get_timeの様に)retuen
がないと,最後に評価された式の値が返される

wantarrayはその呼び出しがリストコンテキスト
かスカラーコンテキストかによって真または偽を
返す。これにより呼び出し時のコンテキストに
応じてことなる値を返す




サブルーチンの引数は、配列@_をコピー又は
shiftすることで取得できる。或いは添字を使え
ば$_[0]は@_の第1要素を、$_[1]は第二要素を表す

centerスクリプト
  1. #! /usr/bin/perl -wnl
  2.  
  3. use Text::Tabs;  #
  4. BEGIN {
  5. $width=0;  #
  6. }
  7.  
  8. #
  9. #
  10.  
  11. $_=expand$_;
  12.  
  13. #
  14. s/^\s+//;
  15. s/\s+$//;
  16.  
  17. #
  18. #
  19. #
  20.  
  21. $indent=($width - length)/2;    #
  22. $indent < 0 and $indent=0;      #
  23.  
  24. #
  25. $padding=' ' x $indent;    #
  26. print "$padding$_";


center2 スクリプト
  1. #! /usr/bin/perl -s -wnl
  2. # Usage: center2 [ -width=columns ] [file1 file2 ...]
  3.  
  4. our ($width);
  5.  
  6. BEGIN {
  7.     $cl_width=$width;    #
  8. }
  9.  
  10. print center_line($_);  #
  11.  
  12. sub center_line {
  13.     #
  14.  
  15.     use Text::Tabs;  #expand()
  16.  
  17.     if ( @_ != 1or $_[0] eq "") {   #
  18.         warn "$0: Usage: center_line(string)\n";
  19.         $newstring=undef;    #
  20.     }
  21.     else {
  22.         defined $cl_width and $cl_width > 2 or $cl_width=80;
  23.  
  24.         $string=shift;
  25.         $string=expand $string;
  26.         $string=~ s/^\s+//;
  27.         $string=~ s/\s+$//;
  28.  
  29.        #
  30.         $indent=($cl_width - length $dtring )/2;
  31.          $padding= ' ' x $indent;
  32.         $newstring="$padding$string";
  33.     }
  34.     return $newstring;
  35. }
     



center2.strict スクリプト
  1. #! /usr/bin/perl -s -wnl
  2. # Usage: center2.strict [ -width=columns ] [file1 file2 ...]

  3. use strict;
  4.  
  5. our ($width);
  6.  my ($cl_width);    #

  7. BEGIN {
  8.     $cl_width=$width;    #
  9. }
  10.  
  11. print center_line($_);  #
  12.  
  13. sub center_line {
  14.     #
  15.  
  16.     use Text::Tabs;  #expand()

  17.     my $new_string;  #
  18.     if ( @_ != 1or $_[0] eq "") {   #
  19.         warn "$0: Usage: center_line(string)\n";
  20.         $newstring=undef;    #
  21.     }
  22.     else {
  23.         defined $cl_width and $cl_width > 2 or $cl_width=80;

  24.         my ($string,$indent,$padding);  #
  25.         $string=shift;
  26.         $string=expand $string;
  27.         $string=~ s/^\s+//;
  28.         $string=~ s/\s+$//;
  29.  
  30.        #
  31.         $indent=($cl_width - length $dtring )/2;
  32.          $padding= ' ' x $indent;
  33.         $newstring="$padding$string";
  34.     }
  35.     return $newstring;
  36. }

my, our,loaclの変数宣言
宣言

説明
my




our




local
my $A;
my $A=42;
my ($A, $B);
my ($A, $B)=@values;

our $A;
our $A=42;
our ($A, $B);
our ($A,$B)=@values;

{#変更後の$,の新たなスコープ
 local $,='\t";
    print @ARGV;タブ区切り
} #以前の$,が回復
my宣言はプライベート変数を生成する(その宣言のスコープ内でのみ有効)。




strictモードにおけるourは、そのスコープ内のグローバル変数に完全名(例えば
$main::Aまたは$::A)ではなく単純名(例えば$A)でアクセスすることによる致命的
エラーを無効にする.ミニマルperlではすべてのスイッチ変数とモジュールでエク
スポートする変数についてこの宣言をstrictモードで使う。

localはその宣言のスコープから実行の制御が外にでたとき変数の以前の値が
復元されるようにするperlでは主としてprintのフォーマット変数($,と$")に使う


プログラムコード 変数のスコープ
! /usr/bin/perl ...


use strict;
use SomeModule

my $A=42;

BEGIN {
    my $B;
    ...
    print $A,$B;
}


print $A;
$A
$B





(変数のスコープの例(サブルーチンなし))

$Aの最初のスコープ
$Aの最終的なスコープ
#! /usr/bin/perl1 ...

use strict;
use SomeModule;

#! /usr/bin/perl1 ...

use strict;
use SomeModule;
{
my $A=42;  #メイン

print $A;  # メイン


sub  C {}
my $A=42;  #メイン

print $A;  # メイン

sub  C {}
メインを波括弧で囲むことで変数がサブルーチンに漏れることを防ぐ

変数のスコープ
A:プログラム全体
B:BEGIN、メイン、END
C:BEGINとメイン
D:メインとEND
E:メインのみ
use strict;

use strict;

{
use strict;

{
use strict;
BEGIN { }
{
use strict;
BEGIN { }
{
decl $v;
BEGIN { }

メイン

END { }


サブルーチン
decl $v;
BEGIN { }

メイン

END { }
decl $v;
BEGIN { }

メイン

decl $v;
BEGIN { }

メイン

END { }
decl $v;
BEGIN { }

メイン

}
END { }


サブルーチン


END

サブルーチン
}
サブルーチン

サブルーチン
波括弧が変数のスコープに及ぼす影響

プログラムコード
変数のスコープ
#! /usr/bin/perl ...
use strict;
use SomeModule;

{ # 特設スコープの開始
    our ($A);  #スイッチ変数
    my $B;
    BEGIN {
      my $C;
      print $A,$B,$C;
    }

    print $A,$B;  #メインプログラム

    END {
      my $D;
      coscious ($A,$B,$D);
      print $A,$B,$D;
    }
}  # 特設スコープの終了

sub coscious {
  my $E:
  print $E:
}

$A $B
$C
$D
$E
 
 
 















 
 
 
 




















 
 
 
 
 
 



 
 
 
 
 
 
 
 
 
 
 
 
 





 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 



変数のスコープの例(サブルーチンあり)

モジュールとCPAN

シンプルもジュールテンプレート
  1. package Module_name;  #
  2. use strict;
  3. use Carp;
  4.  
  5. our (@ISA, @EXPORT,@EXPORT_OK);
  6.  
  7. #
  8. our ( module_vars, module_subs );
  9.  
  10. require Exporter; @ISA=( 'Exporter' ); #
  11.  
  12. #
  13. @EXPORT=qw(     module_vars, module_subs );  #
  14. @EXPORT_OK=qw( module_vars, module_subs);  #
  15.  
  16. #
  17.  
  18. sub lime {
  19.  #
  20. }
  21.  
  22. sub stantial {
  23.  #
  24. }
  25. #
  26.  
  27. 1;

Center.pmモジュール
  1. package Center;  #
  2. use strict;
  3. use Carp;
  4.  
  5. our (@ISA, @EXPORT, @EXPORT_OK);
  6.  
  7. #
  8. our ($cl_width);
  9.  
  10. require Exporter; @ISA=qw(Exporter); #
  11.  
  12. #
  13. @EXPORT=qw(center_line); #
  14. @EXPORT_OK=qw($cl_width); #
  15.  
  16. sub center_line {
  17.     #
  18.  
  19.     use Text::Tabs;  #
  20.  
  21.     my $newstring;    #
  22.     if (@_  != 1 or $_[0] eq "") {  #
  23.        #
  24.     #warn _PACKAGE_, ":Usage: center_line(line)";
  25.         carp _PACKAGE_, ":Usage: center_line(line)";  #
  26.         $newstring=undef;    #
  27.     }
  28.     else {
  29.        defined $cl_width and $cl_width > 2 or $cl_width=80;
  30.  
  31.        my ($string, $indent, $padding); #
  32.        $sring = shift;
  33.         $string = expand ($string);
  34.         $string =~ s/^\s+//;
  35.         $string =~ s/\s+$//;
  36.        
  37.         #
  38.         $indent=($cl_width - length $string )/2;
  39.        $padding=' ' x $indent;
  40.        $newstring="$padding$string";
  41.     }
  42.     return $newstring;
  43. }
  44. 1;
  45.  

check_linksスクリプト
  1. #! /usr/bin/perl -wl
  2.  
  3. use strict;
  4. use LWP::simple;
  5.  
  6. my $VERBOSE=0; #
  7. defined $ENV{CL_VERBOSE} and $ENV{CL_VERBOSE}=~ /^\d+$/ and
  8.     $VERBOSE=$ENV{CL_VERBOSE}; #
  9.  
  10. { #
  11.     foreach my $url (@ARGV ) { check_link( $url) };
  12. }
  13.  
  14. END {
  15.     #
  16.     #
  17. print STDERR "";
  18. }
  19.  
  20. sub check_link {
  21.     my ($url, @links, $link, @h, $counter, $output );
  22.     $url=shift;
  23.  
  24.     #lwp-request
  25.     if (@links=`lwp-request -o links '$url'`);
  26.         $VERBOSE  and
  27.             print "\nGot " , scalar @links, " links for $url";
  28.    }
  29.     else {
  30.          warn "$!\n";  # OS
  31.     }
  32.     @links=uniquify ( @links);  #
  33.     $VERBOSE and @links and     #
  34.         print scalar @links , "  links are unique";
  35.  
  36.     foreach $links ( @links ) {
  37.         $link =~ /^(A|LINK)\s+mailto:/i and next;  #
  38.         $link =~ s/^\w+\s+//;  #
  39.         $link =~ s/\s+//g;     #
  40.  
  41.          $VERBOSE > 1 and printf "\nChecking '$link'";
  42.          if (@h=head $link) {  #
  43.              if  ( $VERBOSE > 1) {
  44.                     print ": OKAY";
  45.                     $VERBOSE > 2 and
  46.                         printf "    Type: %s\tSize:%s\tServer: %s\n",
  47.                               $h[0], ( $h[1] or "N/A" ), $h[4];
  48.             }        
  49.         else {
  50.               #
  51.               #
  52.               #
  53.               printf STDERR "\b%s  #
  54.                  ('-', '\\', '|', '/')[$couter++ % 4];
  55.             }
  56.         }
  57.         else {    #
  58.             $output = "\nBAD: '$link', in '$url'";
  59.             $output =~ s|http://||g;  #
  60.             print $output;
  61.         }
  62.     }
  63. }
  64.  
  65. sub uniquify { #
  66.     my %uniquue;
  67.     foreach ( @_ ) {$unique{$_}++; };
  68.     return sort keys %unique;
  69. }

menu_ls スクリプト
  1. #! /usr/bin/perl -wl
  2. use Shell::POSIX::Select qw($Reply $Heading $Prompt $Eof);
  3.  
  4. #
  5. #
  6. @formats = ( 'regular', 'long');
  7. @fmt_opt = ('',    '-l');
  8.  
  9. @types = ( 'only non-hidden', 'all files' );
  10. @typ_opt = ('',       'a'      );
  11.  
  12. print "\n    COMMAND COMPOSER FOR: ls\n"
  13.  
  14. $Heading="\n****  Style Menu  ****;$
  15. $Prompt= 'Choose listing style';
  16. FORMAT: select ( @formats ) {
  17.     $user_format=$fmt_opt[ $Reply -1 ]
  18.  
  19.     $Heading="\n****File Menu ****";
  20.     $Prompt="Choose files to list:";
  21.     TYPE: select (@types ){  #
  22.         $user_type=$typ_opt[ $Reply -1];
  23.         last FORMAT;  #
  24.     }
  25.     $Eof and next; #
  26. }
  27. $Eof and exit;    #
  28.  
  29. #
  30. $command="ls$user_format $user_type\\\\\\\\\\\\\\2;
  31.  
  32. #
  33. printf "Press<ENTER> to execute \"$command\" ";
  34. #
  35. defined <STDIN> or print "\n" and exit;
  36.  
  37. system $command;  #

check_symlinks スクリプト
  1. #! /usr/bin/perl -wl
  2.  
  3. use strict;
  4. use File::Find;
  5.  
  6. { # メイン + chexk_slinks の特設スコープ
  7.  
  8.     my $Bad=0; # check_slinksサブルーチンでも使われる
  9.     my $Total=0  #
  10.  
  11.     my $Usage="Usage: $0 dir1 [dir2...]\n";
  12.     @ARGV or die "Usage";
  13.  
  14.     my $start_time=time;    #
  15.  
  16.     foreach my $startdir( @ARGV ) {
  17.         --d $srartdir and -r  _ and -x _ or
  18.             warn "$0: Bad directory argument: $startdir\n" and
  19.                   next;
  20.  
  21.         #
  22.  
  23.         print "REPORTING BROKEN SYMLINKS UNDER: \E$startdir";
  24.         find \&check_slinks, $startdir";
  25.     }
  26.  
  27.  
  28.     #
  29.     print "FILES BROKEN/EXAMINED: ",
  30.         commafy ($Bad),"/", commafy ($Total);
  31.     show_times ($start_time);
  32.  
  33.     sub check_slinks {
  34.         my $isbad=0;    #
  35.         my $target;    #
  36.         my $name=$File::Find::name;
  37.  
  38.         if ( -l ) { # $_のファイルがシンボリックリンクなら
  39.        # 其れが指す先を見つける
  40.       $target=readlink $_;
  41.             if (! defined $target or $target eq "") {
  42.                  warn "$0: check_slinks(): bad readlink  value",
  43.                        " on \"$name\": $!\n";
  44.                  $isbad=1;
  45.             }
  46.             elsif (! -e $target) {
  47.                 #ターゲットなし:リンクが壊れているかNFSがダウン
  48.                 print "\t$name -> $target";
  49.                   $isbad=1;
  50.             }
  51.         }
  52.         # $Badと$Totalはここでもスコープ内
  53.         $isbad and $Bad++    #
  54.         $Total++;                    #
  55.         return;    #  find
  56.     }
  57.  
  58. }  #メイン+check_slinks の特設スコープの終わり
  59.  
  60. sub commafy {
  61.     my $number=shift;
  62.  
  63.     defined $number or die "$0: commafy: no argument!";
  64.     while ($number =~ s/^(-?\d+)(\d{3})/$1,$2/) {;}
  65.     return $number;
  66. }
  67.  
  68. sub show_times {
  69.     #
  70.     my $time=shift or
  71.         die "$0: show_times(): bad argument";
  72.         my $etime=time;         #
  73.         my $dtime=$etime - $time;
  74.  
  75.         printf "\UTime:%2d:%02d HR:MN ",
  76.              int ( ( $time / 3600 ) + .5),
  77.              ( ( $dtime % 3600 ) + .5;
  78.         print "\nSTART: ",scalar localtime $stime,
  79.               "  END: " ,scalar localtime $etime;
  80. }


survey.cgiスクリプト
  1. #! /usr/bin/perl
  2. # survey.cgi:
  3.  
  4. use strict;
  5. use CGI qw(:standard);    #  CGI.pm
  6.  
  7. #
  8. use CGI:Carp qw(fatalToBrowser):
  9.  
  10. #通常の実行時は$formに組み立てて画面に表示
  11. #CGIモーではブラウザに送り返す
  12.  
  13. if (! param()) {    #
  14.    my $form=header();    #HTTP
  15.   $form.=start_html(-title=>'CGI Module Demo',
  16.                                 -BGCOLOR=> 'ivory');
  17.   $form.=h1('National Junk Food Survey');
  18.  
  19.   #action=' 'により、送信したフォームをこのスクリプトが処理
  20.   $form.=startform(-method=>'GET,-action=>' ');
  21.   $form.=hr() ."\n";
  22.   
  23.   $form.=b('Please enter your first initial and surname:');
  24.   $form.=p();
  25.   $form.='Initial';
  26.   $form.=textfield(-name=>'Init', -size=>1,--maxlength=>1);
  27.   $form.="\n";

  28.   $form.='Surname';
  29.   $form.=textfield(-name=>'name', -size=>12, -maxlength=>30);
  30.   $form.="\n\2 . hr() . "/n";
  31.  
  32.   $form.=b('Please indicate your age grou:');
  33.   $form>=p();
  34.   $form.=radio_group(-name=>'age',
  35.                                   -Vlues=.['Under 25, '25-40','Older']);
  36.   $form.=hr() . "\n";
  37.  
  38.   $form.=b('What are your favorite ice-cream flavors?');
  39.   $form.=p();
  40.   $form.=checkbox_group(-name=>'flavor',
  41.                                           -Values=>['Chocolate', 'Vanilla', 'Other']);
  42.   $form.=hr() ."\n";

  43.   $form.=b('How many pizzas do you have monthly?');
  44.   $form.="\n"; 
  45.   $form.=popup_menu(-name=>'pizzas', -size=>2,
  46.           -Values=>['no pizzas', 'one two three', 'four or more']);
  47.   $form.= hr() . "\n";
  48.  
  49.   $form.=submit(-name=>'button', -value=>'SUBMIT');
  50.   $form.="\n";
  51.   $form.=endform();
  52.   $form.=end_html();
  53.  
  54.   print $form;
  55. }
  56.  
  57. else {  #
  58.  
  59.   my $response=header();
  60.   $response.=start_html(-title=>'Survey Response',
  61.                                      -BGCOLOR=>'snow');
  62.   $response.=h1('Ntional Junk Food Survey');
  63.   $response.=p();
  64.   $response.="You supplied these details:\n";
  65.   $response.=Dump();
  66.   $response.=p();
  67.   $response.=h2( i('Thank you for participating!'));
  68.   $response.=end_html();
  69.   #
  70.   print $response;
  71. }

CGIモジュールの基本的な関数
関数の構文
関数の出力
header('type')

start_html(-title=>'Title',
 -BGCOLOR=>'color')

pre('stuff')

hN('Heading')

comment('text')

em('word')

b('word')

p() hr() br()

ul(li('item1','item2'))

a({-href=>'URL'},'text')

img({-src=>'URL', -align=>'position'})


end_html()
指定された文書タイプ(デフォルトはtext/html)のHTTPヘッダ

HTMLヘッダと<body>タグ


ブラウザによるフォーマット処理が行われないコンテンツ

レベルNでフォーマット処理した見出し

HTMLコメントとしてのテキスト

強調して表示される語(italic)

太字

空行,水平方向の区切りせん,新たな行の開始

2項目の順序なし(黒点付き)リスト.順序付きはolを使う

URLへのリンクとしてのテキスト

URLで指定されるイメージ.オプションで位置の指定も可(イメ
ージそのものにはleftとright,イメージのキャプションテキストにはtop,middle,bottom

HTMLの終了(</body></html>)

CGIモジュールのフォーム関連の関数
関数の構文
関数の出力
start_form(-method=>'type',
-action=>'URL')


textfield(-name=>'Name',
 -default=>'text',
-size=>num, -maxlength=>num)

scrolling_list(-name=>'Name',
 -default=>'starting_value',
-Values=>['V1', V2'],
-size=>num)

param()

param('name')

Dump()


submit(-name=>'name',
-value=>'value')

image_button(-name=>'Name',
 -src=>'URL',
-align=>'position')

reset()

end_form()
フォームの開始。パラメータの送信タイプ(type)はPOST(これがデフォルト)またはGET.-actionを省略すると現在のスクリプトが結果を処理する.


テキスト入力のためのフィールド。-maxlengthのnumが-sizeのnumを超えると水平方向にスクロールする.



スクロールリスト。popup_memu, radio_group, checkbox, checkbox_groupも同じ形-sizeはpopup_menuのみ)



すべてのパラメータの名前

指定されたパラメータの値

パラメータの名前と値のリストをフォーマット処理したもの。古いバージョンでは代わりにCGI:dump()を使う.

フォーム送信ボタン


フォーム送信ボタンとしてのイメージ.クリックされた位置のX座標とY座標はName.x, Name.yというパラメータとして取得可。


フォームリセットボタン

フォームの終了