[Perlトップページ]

変数と文字列

変数

変数とは、情報を入れる箱のようなものです。たとえば、

$age = 18;

とあると、変数$ageに18という値が入れられることになります。 ここで使われている「=」は代入演算子と呼ばれ、数学での「両辺の値が等しい」という意味ではなく、「右辺の値を左辺に代入する」という意味です。ほかのプログラム言語でも同じですので注意してください。また、末尾に「;」をつけている点も忘れないでください。

変数には数字だけでなく、文字列も入れることができます。たとえば、

$address = '千葉市稲毛区';

とすると、変数$addressに「千葉市稲毛区」という文字列が入れられます。

C言語では変数を使う前に、あらかじめ変数の宣言をしなければなりません。たとえば、下記のプログラムでは、int型の「age」という変数を宣言しています。宣言と同時に「18」という数字を代入しています。

#include <stdio.h>

int main(void)
{
    char name[] = "環境 花子";
    int age = 18;
    char address[] = "千葉市稲毛区";
    
    printf("私の名前は %s です。\n", name);
    printf("私の年齢は %d です。\n", age);
    printf("私の住所は %s です。\n", address);
    
    return 0;
}

ですが、Perlでは「int」のような型を指定する必要もなく、また事前に宣言する必要もなく、使いたいときに自由に使えます。

演習2-1

下記のスクリプトのうち、「環境 花子」、「18」、 「千葉市稲毛区」を自分の情報に書き換えてkadai2-1.plとして保存し、正しく実行されるか確認せよ。

#!/usr/bin/perl

$name = '環境 花子';
$age = 18;
$address = '千葉市稲毛区';

print "私の名前は $name です。\n";
print "私の年齢は $age 才です。\n";
print "私の住所は $address です。\n";
(実行結果)

私の名前は 環境 花子 です。
私の年齢は 18 才です。
私の住所は 千葉市稲毛区 です。

演算子

足し算(加算)、引き算(減算)、掛け算(乗算)、割り算(除算)に関しては、C言語と同じように実行できます。

演習2-2

下記のスクリプトをkadai2-2.plとして保存し、実行結果を確認せよ。

#!/usr/bin/perl

$age = 18;
print "私の年齢は $age 才です。\n";

$tmp = $age - 5;
print "私の5年前の年齢は $tmp 才です。\n";

$tmp = $age + 30;
print "私の30年後の年齢は $tmp 才です。\n";

$age++;
print "私の来年の年齢は $age 才です。\n";

print 364/7, "\n";
print 365/7, "\n";
printf("%5.2lf\n",365/7);
print 365%7, "\n";
print int(365/7), "\n";

print 3**2, "\n";
print -3**2, "\n";
(実行結果)

私の年齢は 18 才です。
私の5年前の年齢は 13 才です。
私の30年後の年齢は 48 才です。
私の来年の年齢は 19 才です。
52
52.1428571428571
52.14
1
52
9
-9

文字列の連結 - . (ピリオド) -

文字列と文字列を連結させたい場合には . (ピリオド)を使います。

演習2-3

下記の左側のスクリプトをkadai2-3.plとして保存し、実行結果を確認せよ。

#!/usr/bin/perl

$univ = '東京情報大学' . '総合情報学部';
print $univ, "\n";

$univ = '東京情報大学' . ' ' . '総合情報学部';
print $univ, "\n";

$x = 123;
$y = 456;

print $x + $y, "\n";
print $x . $y, "\n";
(実行結果)

東京情報大学総合情報学部
東京情報大学 総合情報学部
579
123456

部分文字列の探索 - index, rindex -

indexを使うと、探したい部分文字列が、 大きな文字列の中のどこに含まれるか教えてくれます。たとえば、

print index('Tokyo Joho univ', 'Joho'), "\n";
(実行結果)
6

ですと、先頭の文字を0番目として数えた6番目の位置に、 探したい文字列「Joho」があると教えてくれます。

$univ = '東京情報大学' . '総合情報学部';
print index($univ, '情報'), "\n";
(実行結果)
4

上記の例では、「情報」という文字列は先頭を0番目とすると 2番目に現れますが、日本語の場合1文字は 2バイトで表現されていますので、その2倍の 4番目に来ると表示しますので注意が必要です。

上記の例では、「情報」という文字列は2箇所にあります。 index最初に見つけた位置を教えてくれるのに対して、 rindex最後に見つけた位置を教えてくれるので、使い分けることができます。

$univ = '東京情報大学' . '総合情報学部';
print rindex($univ, '情報'), "\n";
(実行結果)
16

部分文字列の取り出し、置換 - substr -

ある文字列の中から、特定の文字列を取り出したい場合には substrを使います。

変数名 = substr(文字列全体, 取り出したい位置、取り出したい長さ);

とすることで、変数に取り出したい特定の文字列が入れられます。 下記の例を見てください。

$tmp = substr('東京情報大学総合情報学部', 4, 4);
print $tmp, "\n";

または

$univ = '東京情報大学総合情報学部';
$tmp = substr($univ, 4, 4);
print $tmp, "\n";
(実行結果)
情報

substrにはいくつか異なる使い方があります。はじめに、

変数名 = substr(文字列全体, 取り出したい位置);

と、「取り出したい長さ」を省略することで、変数には 取り出したい位置から残り全ての文字列が入れられます。 下記の例を見てください。

$univ = '東京情報大学総合情報学部';
$tmp = substr($univ, 4);
print $tmp, "\n";
(実行結果)
情報大学総合情報学部

substrを使って、特定の文字列を別の文字列に 置き換えることもできます。

substr(文字列全体, 取り出したい位置、取り出したい長さ、置き換える文字列);

と、substrの基本型に「置き換える文字列」を追加するだけの話です。これにより元の文字列は新しい文字列で置き換えられています。下記の例を見てください。

$univ = '東京情報大学総合情報学部';
$tmp = substr($univ, 4, 4, '農業');
print $univ, "\n";
print $tmp, "\n";
(実行結果)
東京農業大学総合情報学部
情報

このsubstrで文字列の置換を行う場合、

という欠点があります。ですので、次に紹介する s//が一般的に使用されます。

演習2-4

下記の左側のスクリプトをkadai2-4.plとして保存し、 実行結果を確認せよ。実行結果は上記の例と同じなので省略する。

#!/usr/bin/perl

$univ = '東京情報大学総合情報学部';
$tmp = substr($univ, 4, 4);
print $tmp, "\n";

$univ = '東京情報大学総合情報学部';
$tmp = substr($univ, 4);
print $tmp, "\n";

$univ = '東京情報大学総合情報学部';
$tmp = substr($univ, 4, 4, '農業');
print $univ, "\n";
print $tmp, "\n";

部分文字列の置換 - s/ / / -

substrで、ある文字列の中から特定の文字列を 別の文字列に置き換えたい場合には、その特定の文字列の位置を 指定する必要があります。しかし、s//では文字列の位置の指定の必要なく、別の文字列に置き換えてくれます。

文字列全[ =~ s/置換前の文字列/置換後の文字列/;

とします。このs/ / /は、様々な修飾子とよばれる オプションを組み合わせることで強力に機能してくれます。 詳しくは正規表現のページに譲りますが、 ここでは下記の演習例を実習してみてください。

演習2-5

下記のスクリプトをkadai2-5.plとして保存し、実行結果を確認せよ。

#!/usr/bin/perl

$univ = '東京情報大学総合情報学部';
$univ =~ s/情報/農業/;
print $univ, "\n";

$univ = '東京情報大学総合情報学部';
$univ =~ s/情報/農業/g;
print $univ, "\n";


$name = 'Tokyo tokyo TOKYO';
$name =~ s/tokyo/TOKYO/;
print $name, "\n";

$name = 'Tokyo tokyo TOKYO';
$name =~ s/tokyo/TOKYO/i;
print $name, "\n";

$name = 'Tokyo tokyo TOKYO';
$name =~ s/tokyo/TOKYO/ig;
print $name, "\n";
(実行結果)

東京農業大学総合情報学部
東京農業大学総合農業学部
Tokyo TOKYO TOKYO
TOKYO tokyo TOKYO
TOKYO TOKYO TOKYO

[Perl講座] [須崎純一トップページ]
須崎純一 京都大学大学 工学研究科都市環境工学専攻 環境情報学講座