7章.関数

N88BASICとperlの順にサンプルプログラムを並べて記述しています。

7.1.算術関数

  1. int(数値)…数値の整数部分を返す
    X=1.73205  $x = 1.73205;
    I=INT(X)   $i = int($x);
    PRINT I    print "$i\n";
    1
    
  2. rand[(範囲)]…乱数発生
    RND[(数式)]
    RND(3)  rand(6)
    
  3. srand[(種)]…乱数の種をセットする
    RANDOMIZE[(種)]
    RANDOMIZE 3  srand(6)
    
  4. time…1970年1月1日から現在までの秒数を返す(perlのみ)

7.2.変換関数

一部perlのみ説明します。

  1. hex(文字列)…文字列を16進数と解釈して,その10進数を返す
    $a = "ff";
    $x = hex($a);
    print "$x\n";
    
    255
    
  2. HEX$(数値)…数値を16進数に変換した文字列を返す
    A$=HEX$(97)        $a = sprintf("%2x",97);
    PRINT A$           print "$a\n";
    A$=HEX$(ASC("a"))  $a = sprintf("%2x",ord("a"));
    PRINT A            $print "$a\n";
    
    61
    61
    
  3. localtime(時間)…time関数などの時間を ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdat)の9要素に変換する。 $monは0〜11月で$wdayは0(日)〜6(土曜日)。

    1996年10月5日13時20分30秒 土曜日

    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdat) =
          localtime(time);
    $mon++;
    print "$year/$mon/$mday $hour:$min:$sec $wday\n";
    
    96/10/5 13:20:30 6
    
  4. oct(文字列)…文字列を8進数と解釈して,その10進数を返す
    $a = "15";
    $x = oct($a);
    print "$x\n";
    
    13
    
  5. ord(文字列)…文字列の先頭文字のアスキーコードを10進数で返す。 N88BASICのASC関数。
    $a = "abc";
    $x = ord($a);
    print "$x\n";
    
    97
    aは(61)16
    

7.3.文字列関数

  1. chop(リスト)…末尾の文字を切り捨てる
    A$="abcdefg"            $a = "abcdefg";
    A$=LEFT$(A$,LEN(A$)-1)  chop($a);
    PRINT A$                print "$a\n";
    abcdef
    
  2. crypt(文字列,暗号化キー文字列)…文字列を暗号化する(perlのみ)

  3. index(文字列,検索文字列[,位置])…検索文字列の位置
    INSTR([位置,]文字列,検索文字列)
    A$="abcdefg"     $a = "abcdefg";
    I=INSTR(A$,"d")  $i = index($a,"d");
    PRINT I          print "$i\n";
    4                3
    
  4. length(文字列)…文字列の長さ
    A$="abcdefg"  $a = "abcdefg";
    I=LEN(A$)     $i = length($a);
    PRINT I       print "$i\n";
    7
    
  5. substr(文字列,位置[,文字数])…文字の取り出し
    perlの場合,位置が負の値の時は右から数えた文字の位置です。
    1. LEFT$
      X$="1234"       $x = "1234";
      A$=LEFT$(X$,3)  $a = substr($x,0,3); #文字の最初は0番目
      PRINT A$        print "$a\n";
      123
      
    2. MID$
      X$="1234"        $x = "1234";
      A$=MID$(X$,2,1)  $a = substr($x,1,1); #文字の最初は0番目
      B$=MID$(X$,3)    $b = substr($x,2); #位置から最後まで
      PRINT A$         print "$a\n";
      PRINT B$         print "$b\n";
      2
      34
      
    3. RIGHT$
      X$="1234"        $x = "1234";
      A$=RIGHT$(X$,2)  $a = substr($x,-2); #右から2桁目の位置から最後まで
      PRINT A$         print "$a\n";
      34
      
    4. 任意の桁の数を作る
      I=3                                  $i = 3;
      X$=RIGHT$("0000"+MID$(STR$(I),2),4)  $x = substr("0000$i",-4);
      PRINT X$                             print "$x\n";
      0003
      

7.4.配列関数とリスト関数

perlのみ説明します。

@x = (10,20,30,40,50)があらかじめ設定されているとして説明します。

  1. join(文字列,リスト)…リストの連結(文字列が区切りになる形式)
    $y = join(".",@x);
    print "$y\n";
    
    10.20.30.40.50
    
  2. pop(配列)…配列の最後の要素を削除する
    pop(@x);
    foreach (@x) {
      print "$_,";
    }
    
    10,20,30,40,
    
  3. push(配列,リスト)…配列の最後にリストを追加する
    $a = 60;
    push(@x,$a);
    foreach (@x) {
      print "$_,";
    }
    
    10,20,30,40,50,60,
    
  4. reverse(リスト)…配列の最後の要素から返す
    foreach (reverse(@x)) {
      print "$_,";
    }
    
    50,40,30,20,10,
    
  5. shift(配列)…配列の先頭の要素を削除する
    shift(@x);
    foreach (@x) {
      print "$_,";
    }
    
    20,30,40,50,
    
  6. splice(配列,位置[,個数[,リスト]])…配列の或る位置から個数分の要素をリストの内容で置き換える。 リストが省略されている場合は取り除くだけです。
    splice(@x,1,2);
    foreach (@x) {
      print "$_,";
    }
    
    10,40,50,
    
    splice(@x,2);
    foreach (@x) {
      print "$_,";
    }
    
    10,20,
    
  7. split(パターン[,文字列[,最大個数]])…文字列をパターンで分離した文字を配列に返す
    $x = "u3001.orange.or.jp";
    ($ip1,$ip2,$ip3,$ip4) = split('\.',$x);
    print "$ip2\n";
    
    orange
    
  8. unshift(配列,リスト)…配列の先頭にリストを追加する
    $a = 70;
    unshift(@x,$a);
    foreach (@x) {
      print "$_,";
    }
    
    70,10,20,30,40,50,
    

7.5.ファイル操作

  1. mkdir(ディレクトリ名,パーミッション)…ディレクトリの作成
    A$="PERLLIB"    $a = "perllib";
    CHILD "MD "+A$  mkdir($a,0755);
    
  2. rename(旧ファイル名,新ファイル名)…ファイル名の変更
    A$="PROG1.TXT"          $a = "prog1.txt";
    B$="PROG1.BAK"          $b = "prog1.bak";
    CHILD "REN "+A$+" "+B$  rename($a,$b);
    
  3. rmdir(ディレクトリ名)…空きディレクトリの削除
    A$="PERLLIB"    $a = "perllib";
    CHILD "RD "+A$  rmdir($a);
    
  4. unlink(ファイルリスト)…ファイルの削除
    A$="TEST.PL"  $a = "test.pl";
    KILL A$       unlink($a);
    

7.6.ファイル入出力

  1. close(ファイルハンドル)…ファイルを閉じる
    OPEN "COUNT.TXT" AS #1  open(IN,"count.txt");
    CLOSE #1                close(IN);
    
  2. eof(ファイルハンドル)…ファイルの最後の検出
    1000 OPEN "COUNT.TXT" FOR INPUT AS #1  open(IN,"count.txt");
    1010 IF EOF(1) THEN CLOSE:END          while(!eof(IN)) {
    1020 LINE INPUT #1,A$                    chop($a = <IN>);
    1030 PRINT A$                            print "$a\n";
    1040 GOTO 1010                         }
                                           close(IN);
    
  3. flock(ファイルハンドル,操作)…ファイルの共有排他制御(perlのみ)
    操作は1:共有,2:排他,4:ブロックしない,8:ロック解除

  4. open(ファイルハンドル[,ファイル名])…ファイルを開く
    詳細はファイルの章を参照のこと。
    ファイル名で"|コマンド"はコマンドへのパイプを開き,"コマンド|"はコマンドからのパイプを開く。
    open(ML,"|/usr/bin/mail -s 'Hello!' pingu@foo.co.jp");
    print ML <<EOF;
    
    Dear kibitaro
    EOF
    close(ML);
    
  5. printf[([ファイルハンドル ]リスト)]…リストの書式印刷
    print ファイルハンドル sprintf(リスト)と同じ

  6. read(ファイルハンドル,変数名,入力長[,位置])…データの入力
    位置が指定されている場合は該当する変数の位置から代入する。
    read(STDIN,$dat,$ENV{'CONTENT_LENGTH'});
    
  7. seek(ファイルハンドル,位置,起点)…ファイルポジションの位置づけ
    位置は起点からの位置。起点の値が1か2のときは負の値でも良い。 起点は0:ファイルの先頭,1:現在の位置,2:ファイルの末尾

  8. sprintf(書式,リスト)…リストの書式化
    A=10                          $a = 10;
    B$="ab"                       $b = "ab";
    PRINT USING "[### @ @]";A,B$  $x = sprintf("[%3d %3s]",$a,$b);
                                  print "$x\n";
    
    [ 10 ab ]                    [ 10  ab] 文字列は右詰め
    
    
    1996年10月5日13時20分30秒のとき
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdat) = localtime(time);
    $year += 1900; $mon++;
    $date = sprintf("%04d/%02d/%02d %02d:%02d", $year,$mon,$mday,$hour,$min); 
    print "$date\n";
    
    1996/10/05 13:20
    

    %m.nx
    mはフィールドの長さ,nは指数表示の場合の長さ,xはフィールドタイプ
    s:文字列, c:文字, d:10進数, x:16進数, o:8進数, e:指数形式, f:固定小数点形式など

    数値の場合,mの前に0を書くと桁数分を0でパディング(埋め合わせ)する
    %04d 値が12だと0012 1だと0001


7.7.ファイルテスト演算子

perlのみ説明します。

演算子内容サンプル
-eファイルがあるif (-e $file) { print "有り\n"; }
if (!(-e $file)) { print "無し\n"; }
-zファイルの大きさが0であるif (-z $file) { print "サイズ0\n"; }
-sファイルがあり大きさが0でないときサイズを返す$s = -s $file;
print "SIZE=$s Bytes\n";
-Mファイルの内容が最後に変更されてからの日数$u = -M $file;
-Aファイルが最後にアクセスされてからの日数$r = -A $file;

ファイルの内容が最後に変更された日時を求めるには

-rw-r--r--   1 kibita  users   4219 Oct  3 20:05 RMAIL

$file = "RMAIL";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdat) =
      localtime(time - (-M $file) * 24 * 3600);
$mon++;
print "$year/$mon/$mday $hour:$min:$sec\n";

96/10/3 20:5:52


7.8.システム呼び出し

  1. sleep[(秒)]…指定された秒数だけ実行を待ち合わせる
    秒を省略したときは無限ループする。

  2. system(リスト)…リストで指定されたコマンドを実行し,それが終わるまで実行を待ち合わせる
    A$="FILEA"        $a = "filea";
    CHILD "TYPE "+A$  system("cat $a");
    

[HOME]

Copyright (c)1996-99 GOMASUKE
Since 09/15/1996, Last Updated 01/10/1999