Perl メモ

[1] 文字列処理

まずは substr 関数から。

substr EXPR, OFFSET, LENGTH, REPLACEMENT
substr EXPR, OFFSET, LENGHT
substr EXPR, OFFSET

使い方は例を見るのが分かりやすいです。

$str = "abcdef";

$substr = substr $str, 3;   # 開始位置は文字列の頭から順に 0,1,2,... と数える
                            # LENGTH を指定しないと最後まで。

# Result: $substr eq "def"



$substr = substr $str, 0, 3;

# Result: $substr eq "abc"



$substr = substr $str, -3, 3;  #  負数を指定すると開始位置を文字列末から数える

# Result: $substr eq "def"



$substr = substr $str, 0, 3, '';

# Result: $substr eq "abc" and $str eq "def"

上の例では、第四引数 REPLACEMENT を指定すると、$str の内容までが変わってしまいます。

第四引数 REPLACEMENT を指定しなければ、$str の内容は変わりません。

REPLACEMENT を指定する代わりに、つぎのような使い方もできます。

substr ( $str, 0, 3 ) = '';

以下、注意すべきこと。

$substr = substr ( $str, 0, 3 ) = '';

は次のコードに等価です。

substr ( $str, 0, 3 ) = '';
$substr = substr $str, 0, 3;

よって、初期値が $str = "abcdefghi" ならば、最初の式で $str eq "defghi" だから、最終的に $substr eq "def" になります。

次に split 関数について。

split /PATTERN/, EXPR, LIMIT
split /PATTERN/, EXPR

EXPR の文字列を PATTERN で与えた「区切り」で分解します。

分解された文字列から成るリストを返します。

split //, "hello";           # ---> 'h','e','l','l','o'
split / /, "hello world";     # --> "hello", "world"
split /\s+/, "hello  world"; # --> "hello", "world"

下の例では @fields == ( 'a', 'b', 'c' ) になります。

$str = "a,b,c,";

@fields = split /,/, $str;

これを @fields == ( 'a', 'b', 'c', '') にしたいのなら、次のようにします。

@fields = split /,/, $str, -1;

join 関数について

join EXPR, LIST

LIST の文字列を EXPR の値(文字列)で結合した結果を返します。

[2] ファイルの読み書き

open 関数を使います。

下は "input.txt" の内容を、そのまま "output.txt" に書き込みます。

"input.txt" が存在しない場合はエラーとなります。 "output.txt" が存在しない場合は、"output.txt" が自動的に作られます。

my ($in, $out); # file handles

open $in, "<", "input.txt"
    or die "can't open file: $!";

open $out, ">", "output.txt"
    or die "can't open file: $!";

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

$in $out は間接ファイルハンドル (indirect file handle) と呼ばれます。 値はファイルハンドルへの参照です。

open の第二引数はモードです。 "<" は読み出し専用。 ">" は書き込み専用モードです。

[3] Quotes(クォート・引用)

まずシングルクォートについて。

'<文字列>'
q/<文字列>/
q[<文字列>]
... ... ...

バックスラッシュ(エスケープ列)や変数を展開しません。

※ ただし \' -> ' や \\ -> \ の展開は行います。

my $name = "Suzuki";

# 下は等価で、Hello, $name!\n を出力します
print 'Hello, $name\n';
print q/Hello, $name!\n/;
print q(Hello, $name!\n);
print q[Hello, $name!\n];
print q<Hello, $name!\n>;

# 下は \ is called 'back slash' を出力します。
print '\\ is called \'back slash\'';

次にダブルクォート。

"<文字列>"
qq/<文字列>/
qq[<文字列>]
... ... ...

バックスラッシュ(エスケープ列)や変数を展開します。

my $name = "Suzuki";

# 下は等価で、Hello, Suzuki[改行] を出力します
print "Hello, $name\n";
print qq/Hello, $name!\n/;
print qq(Hello, $name!\n);
print qq[Hello, $name!\n];
print qq<Hello, $name!\n>;

quoted execution について。

`<文字列>`
qx/<文字列>/
qx[<文字列>]
... ... ...

下はシェルの date 関数を呼び出して、その戻り値を変数 $date に入れます。

my $date = qx[date];
print $date;

quote word について

qw(<LIST>)
qw/<LIST>/
qw[<LIST>]
... ... ...

例。下の二つは等価。

@animals = ('dog', 'cat', 'fox');
@animals = qw(dog cat fox);