まずは 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 の値(文字列)で結合した結果を返します。
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 の第二引数はモードです。 "<" は読み出し専用。 ">" は書き込み専用モードです。
まずシングルクォートについて。
'<文字列>' 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);