Perlの基本文法

はじめに

備忘録の意味も含めて、Perlの基本文法をまとめたいと思います。Perlでは、同じ目的を達成するために様々な書き方が存在します。ここでは、標準的(と私が考える)なものを極力選びました。

スクリプトの実行

Perlで書かれたスクリプトを実行するには、コマンドライン上でperlコマンドを利用します。

$ perl test.pl

構文チェックのためにコンパイルのみを行うには-cオプションを付けます。

$ perl -c test.pl

デバッガを利用するには-dオプションを付けます。

$ perl -d test.pl

また、スクリプトの先頭のシバン(Shebang)でperlインタプリタを指定すれば、スクリプト名だけで実行できます。ファイルに実行権限を与えることをお忘れなく。

#!/usr/bin/perl
...
$ chmod u+x test.pl
$ ./test.pl

コメント

一行コメント

一行をコメントアウトするには#を利用します。行の途中から利用することもでき、#から行末までがスクリプトの実行中に無視されます。

# Comment here
if ($x > 50) {
...
}

my $x = 100; # Comment here

複数行コメント

複数行を同時にコメントアウトするには、対象の行を=podと=cutで囲みます。ただ、通常は複数行であっても#を利用する場合が多いと思います。

=pod
Multiple lines
can be commented
like this.
=cut

変数

スカラー変数

スカラー変数とは、文字列や数値など、一つの値を格納するために使う変数です。変数名は必ず「$」で始め、半角英数および「_」(アンダースコア)が利用できますが、命名規則としてスネークケース(小文字の英語と数字だけを使用し、文字間の連結にアンダースコアを利用する方法)にするのが一般的です。

$number = 10;
$site_url = 'http://blog.codebase.co.jp';

配列変数

配列変数とは、複数の値を順番に格納するために使う変数です。変数名は「@」で始め、それ以降はスカラー変数と同様です。

@fruits = ('Apple', 'Orange', 'Banana');

上記のように、複数の値を同時に格納することもできますし、以下のように何番目に格納するか番号で指定することも可能です。

$fruits[0] = 'Apple';
$fruits[1] = 'Orange';
$fruits[2] = 'Banana';

この場合は、変数名の先頭が「$」になることに注意してください。

ハッシュ変数

ハッシュ変数とは、連想配列変数とも呼ばれ、複数の値をキーを指定して格納するために使う変数です。変数名は「%」で始め、それ以降はスカラー変数と同様です。

%profile = ('Name' => 'Taro', 'Gender' => 'Male', 'Tel' => '090-xxxx-xxxx');

配列と同様、個別にキーを指定して代入することもできます。

$profile{'Name'} = 'Taro';
$profile{'Gender'} = 'Male';
$profile{'Tel'} = '090-xxxx-xxxx';

制御構文

条件分岐

if – elsif – else

条件分岐にはifを使います。

my $fee;
if ($age >= 20) {
    $fee = 1800;
} elsif ($age >= 12) {
    $fee = 1000;
} else {
    $fee = 0;
}

繰り返し

for (foreach)

指定した回数分繰り返すにはforが便利です。

for (my $i = 0; $i < 10; $i++) {
    print $i;
}

また、配列の中身を展開する場合にも利用することができます。

my @fruits = ('Apple', 'Orange', 'Banana');
foreach my $fruit (@fruits) {
    print $fruit;
}

ちなみに、forもforeachも文法上区別はありませんが、私は上記のような使い分けをしています。

YAMLで改行

Ansibleを利用してビルドスクリプトを書いている際に、長くなったコマンドをどう改行するか小一時間悩みました。AnsibleのPlaybookはYAML形式を採用しており、YAMLでスペース区切りの文字列を複数行に渡って書くには「>」を利用するようです。

- command: command option1 option2 option3

と一行で書いていたものは、「>」を利用して以下のよう表現できます。

- command: >
    command
    option1
    option2
    option3

ちなみに、「>」の代わりに「|」を利用すると、各行がスペースではなく改行コードで連結されるようです。

AnsibleのCopyモジュールでワイルドカードを使用する

AnsibleのCopyモジュールでは、srcにワイルドカード(*)を使用することはできません。アスタリスクという文字として解釈されてしまいます。

ファイル名が未確定の場合や、条件に一致した複数のファイルをコピーしたい場合は、with_fileglobを利用します。

- name: Copy files whose name start with a
  copy: src={{ item }} dest=/path/to/dest_dir
  with_fileglob:
    - "/path/to/src_dir/a*"

with_fileglobに指定したパスに該当するファイルが、イテレーティブに{{ item }}変数に代入されコピーが行われます。

Gitでリモートリポジトリを移行する方法

Gitでリモートリポジトリを他のサーバーに移行するには、以下の様に行います。

まず、既存のリポジトリから–bareオプションを指定してcloneします。

$ git clone –-bare ssh://user@oldserver/repo.git

次に、新しいリモートリポジトリに対して–mirrorオプションを指定してpushします。

$ cd repo
$ git push –-mirror ssh://user@newserver/repo.git

以上で、全てのブランチとタグを含んだ、リポジトリの移行が完了します。上記の例では通信プロトコルとしてsshを選択していますが、他でも同様です。

Dockerコマンドのまとめ

コンテナ内からホストへファイルをコピー

$ docker cp <ContainerId>:/path/to/file/in/container /target/path/in/host

起動中のコンテナにログイン

$ docker exec -it <ContainerId> bash

ログ(コンテナからの標準出力)の確認

$ docker logs <ContainerId>

gitコマンドのまとめ

過去のリビジョンにタグを付ける

タグの作成

$ git tag -a <Tag> <Revision> -m <Message>

作成したタグをリモートにプッシュ

$ git push origin --tags

リモートリポジトリを変更

$ git remote set-url origin ssh://user@server:/path/to/repo.git

リモートリポジトリのリビジョンを取得

$ git ls-remote ssh://user@server:/path/to/repo.git <Tag>

ブランチの削除

ローカルリポジトリにあるブランチを削除

$ git branch -d <BranchName>

対応するリモートリポジトリにあるブランチを削除

$ git push --delete origin <BranchName>

変更の取り消し

コミット前の変更を取り消す

$ git checkout .

Dockerを使ってみる

はじめに

Dockerはオープンソースのコンテナ型仮想化ソフトウェアです。VirtualBoxやVMWare等のサーバー仮想化技術とは異なり、一つのOS上に独立したユーザー空間を作ることによって仮想化を実現するため、リソースの使用量が少なくて済むという特徴を持ちます。

導入

DockerをCentOS7上にインストールします。(ちなみにv1.8以降はCentOS6のサポートはされない模様です。)

リポジトリの登録

まず、Dockerの公式リポジトリをyumに登録します。

$ sudo vim /etc/yum.repos.d/docker.repo

[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

Dockerのインストール

yumを利用して、docker-engineパッケージをインストールします。

$ sudo yum install docker-engine

SELinuxが有効の場合は、docker-selinuxもインストールします。

$ sudo yum install docker-selinux

自動起動設定

dockerサービスがサーバー起動時に自動起動されるよう設定します。

$ sudo systemctl enable docker

起動

dockerサービスを起動します。

$ sudo systemctl start docker

コンテナの作成

コンテナイメージのダウンロード

準備が整ったのでコンテナを作成します。コンテナの作成には、その基となるコンテナイメージを利用します。各Linux OSのコンテナイメージはDocker Hubというリポジトリで公開されています。例えば、CentOSのコンテナイメージをダウンロードする場合は、以下の様にします。

$ sudo docker pull centos

ダウンロードしたコンテナイメージはローカルリポジトリに保存されます。保存されているイメージの一覧を確認するには、imagesコマンドを実行します。

$ sudo docker images

コンテナの作成

コンテナイメージを利用してコンテナを作成するにはrunコマンドを実行します。使用するイメージと作成したコンテナ上で実行するコマンドを引数として与えます。

$ sudo docker run centos echo "Hello World"

また、コンテナ作成後にログインをしたい場合は、-i(標準入力を開け続ける)と-t(疑似端末を割り当てる)のオプションを与えた上で、コマンドとしてシェルを指定します。

$ sudo docker run -it centos bash
[root@xxxxxxxxxxxx /]#

コンテナから抜けるにはexitコマンドを実行します。その際、コンテナは自動的に停止します。

[root@xxxxxxxxxxxx /]# exit
$

また、コンテナを作成する際に、コンテナに名前を設定するには–nameオプション、ホスト名を設定するには–hostname(または-h)オプションを利用します。

$ sudo docker run --name test-container --hostname test-host centos

コンテナの削除

存在しているコンテナの一覧を確認するにはpsコマンドを利用します。オプション-aによって、停止しているコンテナを含めて全てが表示されます。

$ sudo docker ps -a

削除したいコンテナを確認したら、IDまたはNAMEを指定してrmコマンドを実行します。実行中のコンテナを削除する場合は-fオプションを付与します。

$ sudo docker rm de3d1454fd9e

 

firewalldによるファイアウォール設定

はじめに

CentOS7からはiptablesではなくfirewalldというファイアウォールが導入されました。(iptablesも利用できるようですが、firewalldが標準となっています。)

起動

起動しているか確認するには、systemctlのstatusコマンドを実行します。

$ sudo systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Tue 2015-11-03 22:27:20 JST; 2h 3min ago
 Main PID: 605 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─605 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

上記のようにactiveという表示が出ていれば起動しています。起動していなければstartコマンドで起動させることができます。

$ sudo systemctl start firewalld

また、自動起動サービスとして登録するには、enableコマンドを実行します。

$ sudo systemctl enable firewalld

ゾーンという概念

 

Top