構文 | split(/パターン/, 文字列, 最大分割数) split の最初の引数で指定したパターンを区切りとして、2番目の引数で指定した文字列を分割する。 区切パターンがある都度分割を繰り返すが、最大分割数で指定した個数になったらそれ以上は分割しない。 limit を省略すると、区切り文字列が出てくる都度、何回でも分割が行われる。 区切り文字列は、通常の文字列のほか正規表現で指定する。 |
例1 | $f = "abcxzdefxzgh"; @a = split(/xz/, $f, 2); 上記の結果は次のようになる。 $a[0] は "abc"、 $a[1] は "defxzgh" となる。 |
例2 | $f = "abcxzdefxzgh"; @a = split(/xz/, $f, 2); 上記の結果は次のようになる。 $a[0] は "abc"、 $a[1] は "def"、 $a[2] は "gh" となる。 |
例3 | $f = "abcxzdefxxgh"; @a = split(/xz|xx/, $f); 上記の結果は次のようになる。 $a[0] は "abc"、 $a[1] は "def"、 $a[2] は "gh" となる。 パターンを正規表現で指定したので、"xz" と "xx" のいずれでも分割する。 |
例4 | $f = "abcxzdefxxgh"; ($a1, $a2) = split(/xz|xx/, $f, 2); 上記の結果は次のようになる。 $a1 は "abc"、 $a2 は "defxxgh" となる。 左辺にリストを書くと、それぞれの変数に分割結果が代入される。 |
例5 | MS Exel のデータを取り込むときは、Exel側でタブ区切りテキスト形式で保存し、次のように 1行ずつ処理していくと良い。 open(IN,"< datafile.txt"); #Exelで保存したファイル名でファイルを開く while($line = <IN>) { #1行ずつ読み込む $line =~ s/\n//; #改行コードを削除 @a = split(/\t/, $line); #タブを区切りとして分割 : : #ここに処理内容を書く : } close(IN); #最後の行まで読み終わったらファイルを閉じる exit; |
構文 | join("区切り文字列", リスト) |
例1 | $x = join("XX", "abc", "def", "ghi"); $x は "abcXXdefXXghi" となる |
例2 | $a1 = "abc"; $a2 = "def"; $a3 = "ghi"; $x = join("XX", $a1, $a2, $a3); $x は "abcXXdefXXghi" となる |
例3 | @a = ("abc", "def", "ghi"); $x = join("XX", @a); $x は "abcXXdefXXghi" となる |
例4 | MS Exel にデータを取り込むときは、perlで次のようにファイルを書き出し、Exel側でタブ区切りテキスト形式として読み込むと良い。 open(OUT, "> datafile.txt"); #書き出し用にファイルを開く for($i = 0; $i < 10; $i++) { #10回繰り返し : : #ここに処理内容を書く : $line = join("\t", @a); #タブ区切りで1行分のデータを作る print OUT $line, "\n"; #ファイルに1行書き出す } close(OUT); #ファイルを閉じる exit; |
構文 | $n = length("文字列") 半角文字を1文字、全角文字を2文字として数える。 |
構文1 | $x = substr($a, 2, 3); |
構文2 | substr($a,2,3) = "pqr"; |
例1 | $a = "abcdefghijk"; $x = substr($a, 2, 3); # $a の 2文字目から 3文字取り出す ただし文字列の先頭は0文字目として数える $x は "cde" となる 注)全角文字1字は2文字として処理される |
例2 | $a = "abcdefghijk"; substr($a, 2, 3) = "pqr"; # $a の 2文字目から 3文字を置き換える ただし文字列の先頭は0文字目として数える $a は "abpqrghijk" となる 注)右辺に置く文字列はsubstrの指定と異なる長さでも良い |
例3 | 正規表現のs/ / / 構文が使えないときにも、 substr()で置換することができる
$a = 'メロンソーダ'; #操作対象の文字列 $b = 'ソーダ'; #検索する文字列 $c = 'ジュース'; #置き換える文字列 print "置き換え前 ", $a, "\n"; substr($a, index($a, $b), length($b)) = $c if(index($a, $b) >= 0); print "置き換え後 ", $a, "\n"; 実行結果は次のようになる 置き換え前 メロンソーダ 置き換え後 メロンジュース 注)検索する文字列が見つからない場合は置き換えが起こらない |
構文1 | index(文字列A, 文字列B) |
構文2 | index(文字列A, 文字列B, 開始位置) |
例1 | $n = index("abcdefgabcdefg", "cd"); $n の値は 2 となる(先頭文字を 0 と数える) |
例2 | $n = index("abcdefgabcdefg", "cd", 5); $n の値は 9 となる(先頭文字を 0 と数えて 5 文字目から検索するので2番目の"cd"の文字数を返す)) |
例3 | すべて検索するには次のようにすると良い $i = 0; while (1) { $n = index("abcdefgabcdefg", "cd", $i); last if($n == -1); $i = $n + 1; print $n, "\n"; } 実行すると 2 と 9 画面に表示する |
構文1 | push(@配列, 要素); |
例1 | @a = ("abc", "def", "ghi"); push(@a, "jkl"); print @a; 結果は abcdefghijkl と出力される |
構文2 | push(@配列, 要素, 要素 ・・・); |
例1 | @a = ("abc", "def", "ghi"); push(@a, "jkl", "mn"); print @a; 結果は abcdefghijklmn と出力される |
構文3 | push(@配列, @配列); |
例1 | @a = ("abc", "def", "ghi"); @b = ("jkl", "mn"); push(@a, @b); print @a; 結果は abcdefghijklmn と出力される |
構文1 | $b = pop(@配列); |
例1 | @a = ("abc", "def", "ghi"); $b = pop(@a); $c = pop(@a); print $b, "\n"; print $c, "\n"; 結果は ghi def と出力される |
構文1 | $b = shift(@配列); |
例1 | @a = ("abc", "def", "ghi"); $b = shift(@a); $c = shift(@a); print $b, "\n"; print $c, "\n"; 結果は abc def と出力される |
構文1 | unshift (@配列, 要素); |
例1 | @a = ("def", "ghi", "jkl"); unshift(@a, "abc"); print @a; 結果は abcdefghijkl と出力される |
構文1 | @配列y = sort(@配列x); @配列x を 昇順に並べ変えた値が @配列y に代入される。 @配列x はそのまま変更されない。 配列の要素はすべて文字列として並べ替えられる。 |
例1 | 昇順に並べ替える @x = ("abc", "ghi", "def"); @y = sort(@x); print "x= $x[0] $x[1] $x[2] \n"; print "y= $y[0] $y[1] $y[2] \n"; 結果は x=abc ghi def y=abc def ghi と出力される |
例2 | reverseと組み合わせて降順に並べ替える @x = ("abc", "ghi", "def"); @y = reverse(sort(@x)); print "x= $x[0] $x[1] $x[2] \n"; print "y= $y[0] $y[1] $y[2] \n"; 結果は x=abc ghi def y=ghi def abc と出力される |
構文2 | @配列y = sort { $a <=> $b } @配列x; @配列x を 昇順に並べ変えた値が @配列y に代入される。 @配列x はそのまま変更されない。 数値として並べ変える。 |
例1 | 昇順に並べ替える(数値の小さな順) @x = (28, 125, 9); @y = sort { $a <=> $b} (@x); print "x= $x[0] $x[1] $x[2] \n"; print "y= $y[0] $y[1] $y[2] \n"; 結果は x=28 125 9 y=9 28 125 と出力される |
例2 | $a と $b を入れ替えることで降順に並べ替える(数値の小さな順) @x = (28, 125, 9); @y = sort { $b <=> $a} (@x); print "x= $x[0] $x[1] $x[2] \n"; print "y= $y[0] $y[1] $y[2] \n"; 結果は x=28 125 9 y=125 28 9 と出力される |
構文3 | @配列y = sort { $a cmp $b } @配列x; @配列x を 昇順に並べ変えた値が @配列y に代入される。 @配列x はそのまま変更されない。 文字列として並べ替える。 |
例1 | 昇順に並べ替える @x = ("abc", "ghi", "def"); @y = sort { $a cmp $b } @x; print "x= $x[0] $x[1] $x[2] \n"; print "y= $y[0] $y[1] $y[2] \n"; 結果は x=abc ghi def y=abc def ghi と出力される |
例2 | $a と $b を入れ替えることで降順に並べ替える @x = ("abc", "ghi", "def"); @y = sort { $b cmp $a } @x; print "x= $x[0] $x[1] $x[2] \n"; print "y= $y[0] $y[1] $y[2] \n"; 結果は x= abc ghi def y= ghi def abc と出力される |
構文4 | @配列y = sort( 関数f @配列x ); @配列x を 関数f で定義する順番に並べ変えた値が @配列y に代入される。 @配列x はそのまま変更されない。 関数f は別途定義する。比較対象は $a と $b で渡されるので、正 0 負 のいずれかで返すようにする。 |
例1 | 昇順に並べ替える @x = ("abc", "ghi", "def"); sub f{ $a cmp $b } #行の末尾に ; が無いことに注意 @y = sort( f @x ); #関数 f と配列 @x の間に , が無いことに注意 print "x= $x[0] $x[1] $x[2] \n"; print "y= $y[0] $y[1] $y[2] \n"; 結果は x=abc ghi def y=abc def ghi と出力される |
構文1 | @配列y = reverse(@配列x); @配列x を 逆順に並べ変えた値が @配列y に代入される。 @配列x はそのまま変更されない。 |
例1 | @x = ("abc", "def", "ghi"); @y = reverse(@x); print "x= $x[0] $x[1] $x[2] \n"; print "y= $y[0] $y[1] $y[2] \n"; 結果は x= abc def ghi y= ghi def abc と出力される |
構文1 | @配列b = grep(/パターン/, @配列a); @配列a の要素のうちパターンにマッチした要素からなる配列が @配列b に代入される。 @配列a はそのまま変更されない。 |
構文2 | $b = grep(/パターン/, @配列a); @配列a の要素のうちパターンにマッチした要素の個数が $b に代入される。 @配列a はそのまま変更されない。 |
例1 | @a = ("axc", "dex", "ghi"); @b = grep(/x/, @a); print "a=", @a, "\n"; print "b=", @b, "\n"; 結果は a=axcdexghi b=axcdex と出力される |
例2 | @a = ("axc", "dex", "ghi"); $b = grep(/x/, @a); print "a=", @a, "\n"; print "b=", $b, "\n"; 結果は a=axcdexghi b=2 と出力される |
構文1 | splice(@配列a, 開始位置, 個数, リスト); @配列a の開始位置から個数分の要素を取り除き、リスト を挿入する。 個数を 0 とすると、挿入のみ。 開始位置は、最初の要素を 0 とする |
構文2 | splice(@配列a, 開始位置); 個数とリストを省略すると開始位置から最後の要素まで削除される。 |
例1 | @a = ("ab", "cd", "ef", "gh"); @b = splice(@a, 1, 2, "CD", "EF"); print "a=", @a, "\n"; print "b=", @b, "\n"; 結果は a=abCDEFgh b=cdef と出力される |
例2 | @a = ("ab", "cd", "ef", "gh"); @b = splice(@a, 1); print "a=", @a, "\n"; print "b=", @b, "\n"; 結果は a=ab b=cdefgh と出力される |
構文1 | @b = keys(%a); 連想配列 %a のkey 一覧を配列 @b に代入する。 |
構文2 | $b = keys(%a); 連想配列 %a のkey の個数を変数 $b に代入する。 |
例1 | $a{"x1"} = "xvalu1"; $a{"x2"} = "xvalu2"; $a{"x3"} = "xvalu3"; @b = keys(%a); print @b, "\n"; 結果は x3x2x1 と出力される 注)出力される順番は、値を代入した順番とは異なる。 |
例2 | $a{"x1"} = "xvalu1"; $a{"x2"} = "xvalu2"; $a{"x3"} = "xvalu3"; $b = keys(%a); print $b, "\n"; 結果は 3 と出力される |
構文1 | @b = values(%a); 連想配列 %a のvalue 一覧を配列 @b に代入する。 |
構文2 | $b = values(%a); 連想配列 %a のvalue の個数を変数 $b に代入する。 |
例1 | $a{"x1"} = "xvalu1"; $a{"x2"} = "xvalu2"; $a{"x3"} = "xvalu3"; @b = values(%a); print @b, "\n"; 結果は xvalu3xvalu2xvalu1 と出力される 注)出力される順番は、値を代入した順番とは異なる。 |
例2 | $a{"x1"} = "xvalu1"; $a{"x2"} = "xvalu2"; $a{"x3"} = "xvalu3"; $b = values(%a); print $b, "\n"; 結果は 3 と出力される |
構文1 | exists($a{"x2"}); 連想配列 %a の key に "x2" が存在するか調べる。 |
例1 | $a{"x1"} = "xvalu1"; $a{"x2"} = "xvalu2"; $a{"x3"} = "xvalu3"; if(exists($a{"x1"})) { print "x1 は存在する\n"; } 結果は x1 は存在する と出力される |
構文1 | delete($a{"x2"}); 連想配列 %a から key が "x2" の値を持つ key と value を削除する。 |
例1 | $a{"x1"} = "xvalu1"; $a{"x2"} = "xvalu2"; $a{"x3"} = "xvalu3"; @b = keys(%a); print "削除前 @b\n"; delete($a{"x2"}); @b = keys(%a); print "削除後 @b\n"; 結果は 削除前 x3x2x1 削除後 x3x1 と出力される なお、連想配列 %a のすべての key, value を削除する場合は %a = (); とすればよい |
構文1 | ($key, $value) = each(%a); 連想配列 %a から key と value のペアを一つ取り出して代入する。 each関数が呼び出されるたびに異なるペアが取り出され、全部取り出した後 呼び出されると、空配列が戻り値となる。さらに呼び出されると最初に戻ってペアを取り出す |
例1 | $a{"x1"} = "xvalu1"; $a{"x2"} = "xvalu2"; $a{"x3"} = "xvalu3"; while(($key, $value) = each(%a)) { print "key=$key Value=$value\n"; } 結果は key=x3 value=xvalu3 key=x2 value=xvalu2 key=x1 value=xvalu1 と出力される 注) foreach 構文 と keys 関数を使って次のように書いても同じことが出来ます $a{"x1"} = "xvalu1"; $a{"x2"} = "xvalu2"; $a{"x3"} = "xvalu3"; foreach $key (keys(%a)) { print "key=", $key, " value=", $a{"$key"}, "\n"; } |
構文 | ファイル名abc.txt ファイルハンドル FILE1 とすると open(FILE1,"abc.txt"); ファイルを開く open(FILE1,"< abc.txt"); 読み込みモードで開く open(FILE1,"> abc.txt"); 書き込みモードで開く open(FILE1,">> abc.txt"); 追加書き込みモードで開く |
例1 | 1行ずつ読み込んで画面に表示する open(IN,"< abc.txt"); while($line = <IN>) { print $line; } close(IN); |
例2 | 1行ずつ読み込んで、画面表示する(行頭と行末に*をつける) open(IN,"< abc.txt"); while($line = <IN>) { $line =~ s/\n//; print "*",$line,"*\n"; #行末の改行を削除 } close(IN); |
例3 | 配列に読み込む open(IN,"< abc.txt"); @lines= <IN>; close(IN); |
例4 | ファイルに書き出す open(OUT,"> abc.txt"); print OUT "1行目\n"; print OUT "2行目\n"; close(OUT); 注 同じファイル名が存在した場合、内容はすべて削除される 行の終わりには必ず改行コード \n を書き出す |
構文 | close(FILE1); |
例 | 上記 open を参照 |
構文 | flock(FILE1, 1); # 読み込み宣言ロック(ブロックモード) flock(FILE1, 2); # 書き込み宣言ロック(ブロックモード) flock(FILE1, 5); # 読み込み宣言ロック(非ブロックモード) flock(FILE1, 6); # 書き込み宣言ロック(非ブロックモード) flock(FILE1, 8); # ロック解除 注)ファイルを閉じるとロックも解除されるので、普通 flock で解除することはしない。 |
構文 | opendir(FILE1, "c:/test"); |
例 | opendir(FILE1, "c:/test"); while($name = readdir(FILE1)) { print $name, "\n"; } closedir(FILE1); ディレクトリ(フォルダ)"c:/test" に含まれるファイル名やサブディレクトリ名(サブフォルダ名)を一覧表示する。 注1)Windows ではディレクトリの階層を "\" で表すが、perl では "/" であらわす。 注2)Windows の場合、S-JIS コードで2バイト目が"\" になる文字で終わるディレクトリ名(フォルダー名)を 指定しても読み出しできない たとえば "c:/一覧表" というディレクトリを読み出すことは出来ない S-JIS コードについては、文字コードのページを参照 |
構文 | closedir(FILE1); |
例 | 上記 opendir を参照。 |
構文1 | $name = readdir(FILE1); #一つずつ読み出す |
構文2 | @names = readdir(FILE1); #配列にまとめて読み出す |
例1 | opendir(FILE1, "c:/test"); while($name = readdir(FILE1)) { print $name, "\n"; } closedir(FILE1); 一つずつ読み出す場合 |
例2 | opendir(FILE1, "c:/test"); @names = readdir(FILE1); closedir(FILE1); foreach $name (@names) { print $name, "\n"; } 配列にまとめて読み出す場合 |
構文 | rewinddir(FILE1); #一つずつ読み出す |
例 | opendir(FILE1, "c:/test"); $name1 = readdir(FILE1); $name2 = readdir(FILE1); print $name1, "\n"; print $name2, "\n"; rewinddir(FILE1); #最初に戻る @names = readdir(FILE1); closedir(FILE1); foreach $name (@names) { print $name, "\n"; } |
構文 | mkdir(パス名); |
例 | mkdir("c:/test/abc"); ディレクトリ "c:/test" の下にサブディレクトリ "abc" を作成する |
構文 | rmdir(パス名); |
例 | rmdir("c:/test/abc"); ディレクトリ "c:/test" の下のサブディレクトリ "abc" を削除する |
構文 | rename("oldfile", "newfile"); |
例1 | rename("abc.txt", "def.txt"); カレントディレクトリに存在するする "abc.txt" のファイル名を "def.txt" に変更する。 |
例2 | rename("abc.txt", "aa/abc.txt"); カレントディレクトリに存在するする "abc.txt" のファイルを、ディレクトリ"aa" の下に移動する。 ディレクトリ"aa" が存在しないときは失敗する。 |
構文 | unlink("file"); |
例1 | unlinke("abc.txt"); カレントディレクトリに存在するする "abc.txt" を削除する。 |
構文 | use Cwd; cwd(); |
例 | use Cwd; $cwd = cwd(); カレントディレクトリの絶対パスが $cwd に代入される |
構文 | use Cwd 'abs_path'; abs_path($file); |
例 | use Cwd 'abs_path'; $abs_path = abs_path("test.txt"); カレントディレクトリにある"test.txt"の絶対パスが $abs_path に代入される |