Perl

Perl

[vagrant@localhost ~]$ perl -v

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

Copyright 1987-2009, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
use strict;
use warnings;

print "hello world\n";

スカラー変数

my $x = 123_234_456

文字列

my $a = "he\tllo\n" #特殊文字、変数展開
my $a = 'hello'

配列

my @sales = (150, 200, 300);
print @sales;

my @sales = (150, 200, 300);
print $sales[1];

ハッシュ変数

my %sales = ("tanaka"=>150, "suzuki"=>200, "yamada"=>300);
print $sales{"tanaka"}

ループ

my $i = 0;

while ($i < 10){
  print "i = $i\n";
  $i++;
}&#91;/perl&#93;

配列ループ
&#91;prel&#93;
my @colors = qw(red green blue orange pink);

foreach my $color(@colors){
  print "color = $color\n";
}&#91;/perl&#93;

ハッシュループ処理
&#91;perl&#93;my %sales = ("tanaka"=>150, "suzuki"=>300, "ohira"=>200);

foreach my $key(keys(%sales)){
  print "sales for $key is $sales{$key}\n";
}

ファイルの読み込み

open(my $in, "<", "test.dat") or die("could not open file.");

while(<$in>){
    print $_;
}

close($in);

置換

$_ =~ s/abc/ABC;

正規表現

while(<$in>){
    $_ =~ s/abc/ABC/;
    if ($_ =~ /[a-z]/){
        print $_;
    }
}

サブルーチン

sub max{
  my $max = $_[0];
  if ($_[1]> $max){
    $max = $_[1];
  }
  return $max;
}


print max(2, 8);

sublime text3 markdown

sublime text3のコンソールに以下のコードを貼り付け、ctl + shift + pでパッケージコントロールをインストールします。

import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f' + '1e3d39e33b79698005270310898eea76'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
# Title 1
## Title 2
### Title 3

hr,強調、blockquote,コード、インデント

こんにちは
---
こんにちは
---
こんにちは
**strong**
> strong
'var = x'
	var = x
	var = 7

リスト、リンク、メール、画像

- item 1
- item 2
- item 3
1. item 1
2. item 2
3. item 3
<http://google.com>
<hogehoge@gmail.com>
[google][1]
[1]:http:/google.com
![book](book.jpg)

なお、マークダウン記法の中にhtmlを書くことも許されています。

github https://github.com/revolunet/sublimetext-markdown-preview

lua

組み込みが容易なスクリプト言語です。

Lua
lua リフェレンスマニュアル 5.3

[vagrant@localhost lua]$ lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
[vagrant@localhost lua]$ lua hello.lua
hello world

luaは多重代入も可能です。

x, y = 10, 15
x, y = y, x
print(x)
print(y)

文字列ではシングル、ダブルクォーテーションどちらも可能です。

s = "h'e'llo"
print(s)

配列:luaは1からカウントします。要素の個数は#です。

a = {23, 234, "hello"}
print(a[2])
print(#a)

条件分岐

score = 75
if score > 60 and score < 80 then
  print("ok")
else
  print("ng!")
end

ループ

i = 0
while i < 10 do
  print(i)
  i = i + 1
end

for文

for i = 0, 9, 2 do
  print(i)
end

構文

a = {12, 24, "hey"}
b = {name = "nari", score= 120}

for i, value in ipairs(a) do
 print(i, value)
 end

関数

function greet(name)
  print("hello, I am "..name)
end

greet("clinton")

可変引数

function sum(...)
  local a = {...}
  local total = 0
  for i = 1, #a do
    total = total + a[i]
  end
  return total
end
print(sum(2, 7, 23141, 131))

便利な命令文

math.max(2, 222, 14)
math.ceil(2.3)
math.floor(2.3)
math.random()
math.random(n) -- 1からnまでの整数値

文字列の命令文

s = string.len("google")
s =  #"google"
s = string.sub("google", 2, 3)
s = string.find("google", "l")
s = string.gsub("google", "e", "er")
s = string.reverse("google")

テーブルの命令文

a = {2, 25, 42, 1}
table.sort(a)

for i, v in inpairs(a) do
  print(v)
end

日付データの命令文

x = os.time()
x = os.date()
print(x)

awk2

条件式

{
  print NR ":" $0
  if (NR % 5 == 0){
   print "--------"
  }
}

forループ

{
 print("%-12s %5d", $1, $3)

 for (i = 0; i < int($3/10); i++){
 printf("*")
 }
 printf("\n")
}

配列

BEGIN{
  sales[1] = 200
  sales[2] = 120
  sales[3] = 50
  print sales[3]

  color = "yellow red blue"
  split(color, colors)
  print colors[3]
}

配列

{
  sales[$1] += $3
}
END {
  for (name in sales){
   print name ":" sales[name]
  }
}

関数の作り方

function getRate(n){
  return int(n / 100) * 0.1
}

{
printf("%-12s %5d rate:%0.1f\n", $1, $3, getRate($3))
}

awk

awkは効率的にテキスト処理を行うことができます。

[vagrant@localhost awk]$ awk --version
GNU Awk 3.1.7
Copyright (C) 1989, 1991-2009 Free Software Foundation.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

本プログラムは、利用価値があることを期待して配布されていますが、
これは、特定目的に使用可能であること、及び、商用目的に使用できる
ことを暗示するものではなく、いかなる保証も一切ありません。
詳しくは、GNU General Public License を参照してください。

You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
{ print $3 }
[vagrant@localhost awk]$ awk -f ex1.awk sales.dat

コマンドラインで、1行で表すこともできます。
awk ‘{print $3}’ sales.dat

行番号の表示

{
print NR ":" $0
}

パターン

NR < 5{
  print NR ":" $0
}

NR > 10{
  print NR ":" $0
}

FS

BEGIN{
 print "--start --"
 FS = "-"
}
{
 print $1
}
NR < 5{
  # print NR ":" $0
}

NR > 10{
  # print NR ":" $0
}
END {
  print "-- end --"
}

条件

(NR == 5) || (NR > 10){
  print NR ":" $0
}

正規表現

$2 ~ /item-[23]/ {
 print $0
}

printとprintfの違い

{
 printf("%s %d\n", $1, $3)
}

表示を整理

{
 printf("%-10s %5d\n", $1, $3)
}

変数

BEGIN{
  sum = 0
}
{
 sum = sum + $3
}
END{
  print sum
}

組み込み関数

{
  printf("%f, %d\n", rand(), int($3/3))
}

GnuCOBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
 WORKING-STORAGE SECTION.
  01 MY-COLORS.
    03 MY-COLOR OCCURS 3 PIC X(10).
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE "red" TO MY-COLOR(1).
    MOVE "yellow" TO MY-COLOR(2).
    MOVE "blue" TO MY-COLOR(3).
    DISPLAY MY-COLORS.
    DISPLAY MY-COLOR(2).
    STOP RUN.
[vagrant@localhost cobol]$ cobc -x --free hello.cob
[vagrant@localhost cobol]$ ./hello
red       yellow    blue
yellow

演算

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
 WORKING-STORAGE SECTION.
  01 MY-DATA.
    03 D1 PIC 99999 VALUE 0.
    03 D2 PIC 99999 VALUE 0.
    03 D3 PIC 99999 VALUE 0.
    03 D4 PIC 99999 VALUE 0.
PROCEDURE DIVISION.
  MAIN SECTION.
    ADD 5 TO D1 D2 D3.
    SUBTRACT 2 FROM D1 D2.
    DISPLAY MY-DATA.
    STOP RUN.

入力受付

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
 WORKING-STORAGE SECTION.
  01 MY-DATA PIC X(10).
PROCEDURE DIVISION.
  MAIN SECTION.
    DISPLAY "whats your name?".
    ACCEPT MY-DATA.
    DISPLAY "hello! " MY-DATA.
    STOP RUN.

条件分岐

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
 WORKING-STORAGE SECTION.
  01 MY-SCORE PIC 9(3).
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE 80 TO MY-SCORE.
    If MY-SCORE > 60 THEN
      DISPLAY "OK!"
    END-IF.
    STOP RUN.

条件分岐

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
 WORKING-STORAGE SECTION.
  01 MY-SIGNAL PIC X(5).
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE "red" TO MY-SIGNAL.
    EVALUATE MY-SIGNAL
      WHEN "red"
        DISPLAY "stop!"
      WHEN "blue"
          DISPLAY "run!"
      WHEN "yello"
            DISPLAY "caution!"
    END-EVALUATE.
    STOP RUN.

繰り返し処理

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
 WORKING-STORAGE SECTION.
  01 MY-COUNTER PIC 9(3) VALUE 1.
PROCEDURE DIVISION.
  MAIN SECTION.
    PERFORM 10 TIMES
      DISPLAY "counter = " MY-COUNTER
      ADD 1 TO MY-COUNTER
    END-PERFORM.
    STOP RUN.

ファイルの書き込み

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
  INPUT-OUTPUT SECTION.
    FILE-CONTROL.
      SELECT OUT-FILE ASSIGN TO 'out.txt'
        ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
  FILE SECTION.
    FD OUT-FILE.
      01 OUT-FILE-REC PIC 99.
 WORKING-STORAGE SECTION.
  01 LINE-COUNT PIC 99 VALUE 0.
PROCEDURE DIVISION.
  MAIN SECTION.
    OPEN OUTPUT OUT-FILE.

    PERFORM 10 TIMES
      ADD 1 TO LINE-COUNT
      MOVE LINE-COUNT TO OUT-FILE-REC
      WRITE OUT-FILE-REC
      DISPLAY OUT-FILE-REC
    END-PERFORM.

    CLOSE OUT-FILE.
    STOP RUN.

ファイルの読み出し

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
  INPUT-OUTPUT SECTION.
   FILE-CONTROL.
    SELECT IN-FILE ASSIGN TO 'in.txt'
     ORGANIZATION IS LINE SEQUENTIAL
     STATUS IN-FILE-STATUS.
DATA DIVISION.
  FILE SECTION.
   FD IN-FILE.
    01 In-FILE-REC PIC X(20).
  WORKING-STORAGE SECTION.
   01 IN-FILE-STATUS PIC XX.
PROCEDURE DIVISION.
  MAIN SECTION.
    OPEN INPUT IN-FILE.

    PERFORM UNTIL IN-FILE-STATUS NOT = "00"
     READ IN-FILE
       AT END
         DISPLAY "-- end --"
       NOT AT END
         DISPLAY "Content: " IN-FILE-REC
    END-READ
    END-PERFORM.

    CLOSE IN-FILE.
    STOP RUN.

OPEN-COBOL

COBOLはcommon business oriented languageの略で、書式のルールが厳格です。文末がピリオドで、大文字です。

DIVISION > SECTION

cobol

開発環境に必要となるファイルをインストールしていきましょう。

# yum -y install gcc
# yum -y install gmp-devel
# yum -y install ncurses-devel
# yum -y install db4-devel
# wget http://downloads.sourceforge.net/open-cobol/open-cobol-1.0.tar.gz
# tar zxvf open-cobol-1.0.tar.gz
# cd open-cobol-1.0
# ./configure
# make
# make install
# ln -s /usr/local/lib/libcob.so.1.0.0 /usr/lib/libcob.so.1
# ln -s /usr/local/lib/libcob.so.1.0.0 /usr/lib/libcob.so
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/li

自由書式です。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
  MAIN SECTION.
    DISPLAY 'HELLO WORLD!'.
    STOP RUN.
[vagrant@localhost cobol]$ cobc -x --free hello.cob
[vagrant@localhost cobol]$ ls
hello  hello.cob
[vagrant@localhost cobol]$ ./hello
HELLO WORLD!

変数

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
 WORKING-STORAGE SECTION.
  01 MY-DATA1 PIC X(20).
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE 'HELLO WORLD!' TO MY-DATA1.
    DISPLAY MY-DATA1.
    STOP RUN.

数値の変数

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
 WORKING-STORAGE SECTION.
  01 MY-DATA1 PIC X(20).
  01 MY-DATA2 PIC 99999.
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE 120 TO MY-DATA2.
    MOVE 'HELLO WORLD!' TO MY-DATA1.
    DISPLAY MY-DATA2.
    STOP RUN.

集合項目

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
 WORKING-STORAGE SECTION.
  01 MY-PRODUCT.
    03 PRODUCT-ID PIC X(5).
    03 PRODUCT-PRICE PIC 9(5).
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE "ID-12" TO PRODUCT-ID.
    MOVE 2980 TO PRODUCT-PRICE.
    DISPLAY PRODUCT-PRICE.
    DISPLAY MY-PRODUCT.
    STOP RUN.

gcc

[vagrant@localhost c]$ gcc -v
Using built-in specs.
Target: x86_64-redhat-linux
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
スレッドモデル: posix
gcc version 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
#include <stdio.h>

int main(void){
  printf("hello world!\n");
  return 0;
}
[vagrant@localhost c]$ gcc -o hello hello.c
[vagrant@localhost c]$ ll
合計 12
-rwxrwxr-x. 1 vagrant vagrant 6425 11月 10 06:31 2016 hello
-rw-rw-r--. 1 vagrant vagrant   84 11月 10 06:30 2016 hello.c
[vagrant@localhost c]$ ./hello
hello world!

なお、Cでつまづきやすいと言われているポインタですが、アドレスの値を定義して(参照渡し)、データ型よりもメモリの消費を節約する仕組みで、より高速なプログラムが書けるようになります。

basicの操作

basicの拡張子はbasです。save、loadでファイルの保存呼び出しを行います。
コメント:rem

10 rem コメント
20 print "hello world"
25 print "hello world again"
>save "hello.bas"
>list
10 rem コメント
20 print "hello world"
25 print "hello world again"
>new
>list
>load "hello.bas"
>list
10 rem コメント
20 print "hello world"
25 print "hello world again"

goto文

>list
10 rem コメント
20 print "hello world"
25 print "hello world again"
30 goto 20
>

変数

>new
>10 x = 5
>20 print x
>run
5

if文

>new
>10 score = 80
>20 if score > 60 then print "ok"
>list
10 score = 80
20 if score > 60 then print "ok"
>run
ok

ifとgoto文

>20 if socre > 60 then goto 30 else goto 40
>30 print "ok"
>40 print "ng"
>30 print "ok": end
>run
ng

ループ

>new
>10 for i = 1 to 10
>20 print i
>30 next i
>list
10 for i = 1 to 10
20 print i
30 next i
>run
1
2
3
4
5
6
7
8
9
10

サブルーチン

>new
>10 print "hello"
>20 gosub 100
>30 end
>100 print "hello from subroutine!"
>110 return
>list
10 print "hello"
20 gosub 100
30 end
100 print "hello from subroutine!"
110 return
>run
hello
hello from subroutine!
>

サブルーチン

>new
>10 input "your age? ", age
>20 print "your are "; age; " years old!"
>list
10 input "your age? ",age
20 print "your are ";age;" years old!"
>ru
 Syntax error
>run
your age? 18
your are 18  years old!
>

basicの数当てゲーム

10 answer = int(rnd(1)*10)+1
20 input "guess (1-10)? ",guess
30 if guess > answer then print "too high!" : goto 20
40 if guess < answer then print "too low!" : goto 20
50 if guess = answer then print "you got it!" : end
>run
guess (1-10)? 4
you got it!

chipmunk Basic

Basicを使うには、コマンドラインでchipmunk Basicを使います。サイトからダウンロードして、フォルダにbasic.exeを入れて、以下のように移動します。

Desktop\basic> ./basic
Chipmunk BASIC v3.6.5(b6)
>

basicは行番号と命令を対にして書いていきます。なんとも言えない雰囲気ですね。
実行するにはrun、終了はquitを使います。
%e7%84%a1%e9%a1%8c

endは省略可能、listで命令文を表示します。

>list
10 cls
20 print "hello world"
30 end
>10 rem コメント
>list
10 rem コメント
20 print "hello world"
30 end
>25 print "hello world again"
>list
10 rem コメント
20 print "hello world"
25 print "hello world again"
30 end
>del 30
>list
10 rem コメント
20 print "hello world"
25 print "hello world again"