Perl/関数
プログラミング > Perl > Perl/関数
関数とは

Perlの「関数」は、与えられた値に基づいて定義された独自の処理を実行し、その結果を返す一塊のコードのことです。 英語では関数のことを function と呼び、「機能」と訳すことができます。 Perlの「関数」には、言語コアで定義済みの「組込み関数」とユーザーが定義する「サブルーチン」とがあります。 サブルーチンをつくる場合にも、最終的には、プログラマーの手により「組込み関数」「式」や「文」をくみあわせて作成することになります。 前節で紹介した print 関数は、組込み関数です。 このように、組込み関数は、名前を使って呼出すだけで使えます。 いっぽう、サブルーチンは、名前を使って呼び出す以前に、処理の内容もプログラマーが作成する(サブルーチを定義する)必要があります。
組込み関数

Perlの言語コアで定義済みの関数のことを「組込み関数」と言います。
組込み関数

中には my, use や do の様に、見るからに構文要素なものも「組込み関数」に分類されています。
組込み関数

Perl 5.10 から導入されたsay 関数は、行末で改行を行います。これで、都度 \n を文字列末に記述する手間が省けます。
組込み関数

Perlでは、文字列の中に変数や式を埋め込むことができ、テンプレート言語であるかのような使いかたが出来ます。
組込み関数

平方根などの数学計算をする関数が用意されています。
組込み関数

桁あふれ対策と可変引数に対応したPerl版hypotの例。
組込み関数

sin,cos は組込み関数にありますが、tan, acos など他の三角関数や円周率(pi)を使用するには、use宣言を使って Math::Trigモジュールから導入します。
組込み関数

現在の日時や時刻などを表すには、time関数およびlocaltime関数を使います。
組込み関数

split関数には、与えられたパターンで文字列を区切り、リストで返します。
サブルーチン

Perlでは、ユーザーが定義する関数のことをサブルーチン( subroutine )と呼び、キーワードsubを使い定義します。
サブルーチン

サブルーチンの定義と呼出しは、説明することがほとんどないほど簡単です。
サブルーチン

サブルーチンの定義より先にサブルーチンを呼出す必要があることがあります(典型的には、お互いに呼び合う関数)。 この場合は、呼出ごとに & を前置するか、サブルーチン宣言をサブルーチン呼出の前にします。
サブルーチン

前出の例は、ほとんど同じ内容のサブルーチンを2つ用意しましたが、1つにまとめてみましょう。
サブルーチン

前出の例は、グローバル変数を使っていましたが、グローバル変数はデーターフロー的なスパゲティーコードに直結するので、引数を使ってスマートに実装してみましょう。
サブルーチン

この @_ による引数の受渡しは、Perlでは約20年に渡って使われてきましたが、他のプログラミング言語のように名前付きの仮引数が欲しいとの要望は根強く、シグネチャーとしてv5.20.0から実験的な機能として実装されています。
サブルーチン

ここまでで、引数を受取りサブルーチンの振舞いを変えることができるようになりました。 次に、「値を返す手段」が問題になります。 グローバル変数を使って値を返せそうですが「データーフロー的なスパゲティーコード」になるのでサブルーチンの「戻値」を使ってみましょう。
サブルーチン

いままでのサブルーチンは値を返しませんでしたが、Perlのサブルーチンは値を1つ返すことができます。
サブルーチン

引数と戻値が手に入ったので、再帰的呼出しを行うサブルーチンを書いてみます。
サブルーチン

整数の累乗を返すサブルーチン pow を書いてみました。
サブルーチン

整数を3桁ごとにカンマで区切って表示するサブルーチン comma3 を書いてみました。
サブルーチン

再帰で必ず取上げられるフィボナッチ数列とメモ化を題材に、ベンチマークテストを行ってみようと思います。
サブルーチン

サブルーチン自身へのリファレンス __SUB__ を使うと無名関数の再帰ができます。
サブルーチン

前出の例で、引数を使ってサブルーチンの振る舞いを変えることができました。
サブルーチン

機能的には充足しているのですが、名前付きの仮引数を望む声は以前からあり、Perl 5.20.0 から「実験的」( experimental )なシグネチャーの実装が行なわれ、Perl 5.26.0 からコア機能の1つとなりました。
サブルーチン

sort のように、コードブロックを引数とするサブルーチンを考えてみましょう。
サブルーチン

組込み関数 map を模倣したサブルーチン mapx を実装します。
サブルーチン

組込み関数に reduce がなかったので実装しました。
サブルーチン

組込み関数に grep は、多くの言語で filter の名前で知られる関数です。
サブルーチン

[TODO:スコープルールに関する簡素な説明]
サブルーチン

[TODO:コンテキストに関する例をふんだんに使った解説]
永続的スコープのレキシカル変数

my で宣言した変数(レキシカル変数)はサブルーチンを抜けると御破算になりますが、state で宣言した変数はレキシカルスコープであるものの次にサブルーチンが呼ばれたときも値を憶えています。
コンテキストとwantarray関数

同じサブルーチンを呼出しても、スカラーが戻ることを期待している文脈(スカラーコンテキスト)と、リストが戻ることを期待している文脈(リストコンテキスト)の2通りがあります。 この2つのケースを判別するために wantarray 関数が用意されています。
組込み関数の一覧

chomp chop chr crypt fc hex index lc lcfirst length oct ord pack q/STRING/ qq/STRING/ reverse rindex sprintf substr tr/// uc ucfirst y///
組込み関数の一覧

テキストのエンコーディングは、Perlを使っていると度々トラブルのもとになるので、回避方法が幾つかある事を知っておくと、他人の書いたコードを読むときなどに役に立ちます。 ここで紹介した方法の他に、歌代さんのjcode.plなどもあるのですが、標準モジュールの範囲の説明に留めました。
組込み関数の一覧

文字列 EXPR から、OFFSET 目以降のバイト列を返します。取り出す長さ LENGTH をバイト単位で指定できますが、省略した場合は文字列の最後まで取り出します。なお、utf8プラグマが有効な場合は、バイト単位ではなく文字単位で取り出すことができます。
組込み関数の一覧

位置情報 OFFSET は上述のとおり 0 から始まりますが、LENGTH は容量なので通常は 1 以上の値を指定します。
組込み関数の一覧

文字列 REPLACEMENT を指定すると、取り出される部分を REPLACEMENT で置換します。
組込み関数の一覧

シングルクォート、ダブルクォート、正規表現、バッククォート、単語クォート。詳細は演算子の章を参照。
組込み関数一覧

each keys pop push shift splice unshift values
組込み関数一覧

retrieve the next key/value pair from a hash
組込み関数一覧

retrieve list of indices from a hash
組込み関数一覧

remove the last element from an array and return it
組込み関数一覧

append one or more elements to an array
組込み関数一覧

remove the first element of an array, and return it
組込み関数一覧

add or remove elements anywhere in an array
組込み関数一覧

prepend more elements to the beginning of a list
組込み関数一覧

return a list of the values in a hash
組込み関数一覧

pack read syscall sysread sysseek syswrite unpack vec
組込み関数一覧

convert a list into a binary representation
組込み関数一覧

fixed-length buffered input from a filehandle
組込み関数一覧

execute an arbitrary system call
組込み関数一覧

fixed-length unbuffered input from a filehandle
組込み関数一覧

position I/O pointer on handle used with sysread and syswrite
組込み関数一覧

fixed-length unbuffered output to a filehandle
組込み関数一覧

convert binary structure into normal perl variables
組込み関数一覧

test or set particular bits in a string
組込み関数一覧

-X chdir chmod chown chroot fcntl glob ioctl link lstat mkdir open opendir readlink rename rmdir select stat symlink sysopen umask unlink utime
組込み関数一覧

a file test (-r, -x, etc)
組込み関数一覧

change your current working directory
組込み関数一覧

changes the permissions on a list of files
組込み関数一覧

change the ownership on a list of files
組込み関数一覧

make directory new root for path lookups
組込み関数一覧

file control system call
組込み関数一覧

expand filenames using wildcards
組込み関数一覧

system-dependent device control system call
組込み関数一覧

create a hard link in the filesystem
組込み関数一覧

stat a symbolic link
組込み関数一覧

create a directory
組込み関数一覧

open a file, pipe, or descriptor
組込み関数一覧

open a directory
組込み関数一覧

determine where a symbolic link is pointing
組込み関数一覧

change a filename
組込み関数一覧

remove a directory
組込み関数一覧

reset default output or do I/O multiplexing
組込み関数一覧

get a file's status information
組込み関数一覧

create a symbolic link to a file
組込み関数一覧

open a file, pipe, or descriptor
組込み関数一覧

set file creation mode mask
組込み関数一覧

remove one link to a file
組込み関数一覧

set a file's last access and modify times
組込み関数一覧

break caller continue die do dump eval evalbytes exit __FILE__ goto last __LINE__ next __PACKAGE__ redo return sub __SUB__ wantarray
組込み関数一覧

break out of a C<given> block
組込み関数一覧

get context of the current subroutine call
組込み関数一覧

optional trailing block in a while or foreach
組込み関数一覧

raise an exception or bail out
組込み関数一覧

turn a BLOCK into a TERM
組込み関数一覧

create an immediate core dump
組込み関数一覧

catch exceptions or compile and run code
組込み関数一覧

similar to string eval, but intend to parse a bytestream
組込み関数一覧

terminate this program
組込み関数一覧

the name of the current source file
組込み関数一覧

create spaghetti code
組込み関数一覧

exit a block prematurely
組込み関数一覧

the current source line number
組込み関数一覧

iterate a block prematurely
組込み関数一覧

the current package
組込み関数一覧

start this loop iteration over again
組込み関数一覧

get out of a function early
組込み関数一覧

declare a subroutine, possibly anonymously
組込み関数一覧

the current subroutine, or C<undef> if not in a subroutine
組込み関数一覧

get void vs scalar vs list context of current subroutine call
組込み関数一覧

delete each exists keys values
組込み関数一覧

deletes a value from a hash
組込み関数一覧

retrieve the next key/value pair from a hash
組込み関数一覧

test whether a hash key is present
組込み関数一覧

retrieve list of indices from a hash
組込み関数一覧

return a list of the values in a hash
組込み関数一覧

binmode close closedir dbmclose dbmopen die eof fileno flock format getc print printf read readdir readline rewinddir say seek seekdir select syscall sysread sysseek syswrite tell telldir truncate warn write
組込み関数一覧

prepare binary files for I/O
組込み関数一覧

close file (or pipe or socket) handle
組込み関数一覧

close directory handle
組込み関数一覧

breaks binding on a tied dbm file
組込み関数一覧

create binding on a tied dbm file
組込み関数一覧

raise an exception or bail out
組込み関数一覧

test a filehandle for its end
組込み関数一覧

return file descriptor from filehandle
組込み関数一覧

lock an entire file with an advisory lock
組込み関数一覧

declare a picture format with use by the write() function
組込み関数一覧

get the next character from the filehandle
組込み関数一覧

output a list to a filehandle
組込み関数一覧

output a formatted list to a filehandle
組込み関数一覧

fixed-length buffered input from a filehandle
組込み関数一覧

get a directory from a directory handle
組込み関数一覧

fetch a record from a file
組込み関数一覧

reset directory handle
組込み関数一覧

output a list to a filehandle, appending a newline
組込み関数一覧

reposition file pointer for random-access I/O
組込み関数一覧

reposition directory pointer
組込み関数一覧

reset default output or do I/O multiplexing
組込み関数一覧

execute an arbitrary system call
組込み関数一覧

fixed-length unbuffered input from a filehandle
組込み関数一覧

position I/O pointer on handle used with sysread and syswrite
組込み関数一覧

fixed-length unbuffered output to a filehandle
組込み関数一覧

get current seekpointer on a filehandle
組込み関数一覧

get current seekpointer on a directory handle
組込み関数一覧

shorten a file
組込み関数一覧

print debugging info
組込み関数一覧

print a picture record
組込み関数一覧

grep join map qw/STRING/ reverse sort unpack
組込み関数一覧

locate elements in a list test true against a given criterion
組込み関数一覧

join a list into a string using a separator
組込み関数一覧

apply a change to a list to get back a new list with the changes
組込み関数一覧

quote a list of words
組込み関数一覧

flip a string or a list
組込み関数一覧

sort a list of values
組込み関数一覧

convert binary structure into normal perl variables
組込み関数一覧

abs atan2 cos exp hex int log oct rand sin sqrt srand
組込み関数一覧

absolute value function
組込み関数一覧

arctangent of Y/X in the range -PI to PI
組込み関数一覧

cosine function
組込み関数一覧

raise I<e> to a power
組込み関数一覧

convert a hexadecimal string to a number
組込み関数一覧

get the integer portion of a number
組込み関数一覧

retrieve the natural logarithm for a number
組込み関数一覧

convert a string to an octal number
組込み関数一覧

retrieve the next pseudorandom number
組込み関数一覧

return the sine of a number
組込み関数一覧

square root function
組込み関数一覧

seed the random number generator
組込み関数一覧

defined formline lock prototype reset scalar undef
組込み関数一覧

test whether a value, variable, or function is defined
組込み関数一覧

internal function used for formats
組込み関数一覧

get a thread lock on a variable, subroutine, or method
組込み関数一覧

get the prototype (if any) of a subroutine
組込み関数一覧

clear all variables of a given name
組込み関数一覧

force a scalar context
組込み関数一覧

remove a variable or function definition
組込み関数一覧

do import no package require use
組込み関数一覧

turn a BLOCK into a TERM
組込み関数一覧

patch a module's namespace into your own
組込み関数一覧

unimport some module symbols or semantics at compile time
組込み関数一覧

declare a separate global namespace
組込み関数一覧

load in external functions from a library at runtime
組込み関数一覧

load in a module at compile time and import its namespace
組込み関数一覧

caller import local my our package state use
組込み関数一覧

get context of the current subroutine call
組込み関数一覧

patch a module's namespace into your own
組込み関数一覧

create a temporary value for a global variable (dynamic scoping)
組込み関数一覧

declare and assign a local variable (lexical scoping)
組込み関数一覧

declare and assign a package variable (lexical scoping)
組込み関数一覧

declare a separate global namespace
組込み関数一覧

declare and assign a persistent lexical variable
組込み関数一覧

load in a module at compile time and import its namespace
組込み関数一覧

endprotoent endservent gethostbyaddr gethostbyname gethostent getnetbyaddr getnetbyname getnetent getprotobyname getprotobynumber getprotoent getservbyname getservbyport getservent sethostent setnetent setprotoent setservent
組込み関数一覧

be done using protocols file
組込み関数一覧

be done using services file
組込み関数一覧

get host record given its address
組込み関数一覧

get host record given name
組込み関数一覧

get next hosts record
組込み関数一覧

get network record given its address
組込み関数一覧

get networks record given name
組込み関数一覧

get next networks record
組込み関数一覧

get protocol record given name
組込み関数一覧

get protocol record numeric protocol
組込み関数一覧

get next protocols record
組込み関数一覧

get services record given its name
組込み関数一覧

get services record given numeric port
組込み関数一覧

get next services record
組込み関数一覧

prepare hosts file for use
組込み関数一覧

prepare networks file for use
組込み関数一覧

prepare protocols file for use
組込み関数一覧

prepare services file for use
組込み関数一覧

bless dbmclose dbmopen package ref tie tied untie use
組込み関数一覧

create an object
組込み関数一覧

breaks binding on a tied dbm file
組込み関数一覧

create binding on a tied dbm file
組込み関数一覧

declare a separate global namespace
組込み関数一覧

find out the type of thing being referenced
組込み関数一覧

bind a variable to an object class
組込み関数一覧

get a reference to the object underlying a tied variable
組込み関数一覧

break a tie binding to a variable
組込み関数一覧

load in a module at compile time and import its namespace
組込み関数一覧

alarm exec fork getpgrp getppid getpriority kill pipe qx/STRING/ readpipe setpgrp setpriority sleep system times wait waitpid
組込み関数一覧

schedule a SIGALRM
組込み関数一覧

abandon this program to run another
組込み関数一覧

create a new process just like this one
組込み関数一覧

get process group
組込み関数一覧

get parent process ID
組込み関数一覧

get current nice value
組込み関数一覧

send a signal to a process or process group
組込み関数一覧

open a pair of connected filehandles
組込み関数一覧

backquote quote a string
組込み関数一覧

execute a system command and collect standard output
組込み関数一覧

set the process group of a process
組込み関数一覧

set a process's nice value
組込み関数一覧

block for some number of seconds
組込み関数一覧

run a separate program
組込み関数一覧

return elapsed time for self and child processes
組込み関数一覧

wait for any child process to die
組込み関数一覧

wait for a particular child process to die
組込み関数一覧

m// pos qr/STRING/ quotemeta s/// split study
組込み関数一覧

match a string with a regular expression pattern
組込み関数一覧

find or set the offset for the last/next m//g search
組込み関数一覧

compile pattern
組込み関数一覧

quote regular expression magic characters
組込み関数一覧

replace a pattern with a string
組込み関数一覧

split up a string using a regexp delimiter
組込み関数一覧

no-op, formerly optimized input data for repeated searches
組込み関数一覧

accept bind connect getpeername getsockname getsockopt listen recv send setsockopt shutdown socket socketpair
組込み関数一覧

accept an incoming socket connect
組込み関数一覧

binds an address to a socket
組込み関数一覧

connect to a remote socket
組込み関数一覧

find the other end of a socket connection
組込み関数一覧

retrieve the sockaddr for a given socket
組込み関数一覧

get socket options on a given socket
組込み関数一覧

register your socket as a server
組込み関数一覧

receive a message over a Socket
組込み関数一覧

send a message over a socket
組込み関数一覧

set some socket options
組込み関数一覧

close down just half of a socket connection
組込み関数一覧

create a socket
組込み関数一覧

create a pair of sockets
組込み関数一覧

chomp chop chr crypt fc hex index lc lcfirst length oct ord pack q/STRING/ qq/STRING/ reverse rindex sprintf substr tr/// uc ucfirst y///
組込み関数一覧

remove a trailing record separator from a string
組込み関数一覧

remove the last character from a string
組込み関数一覧

get character this number represents
組込み関数一覧

one-way passwd-style encryption
組込み関数一覧

return casefolded version of a string
組込み関数一覧

convert a hexadecimal string to a number
組込み関数一覧

find a substring within a string
組込み関数一覧

return lower-case version of a string
組込み関数一覧

return a string with just the next letter in lower case
組込み関数一覧

return the number of characters in a string
組込み関数一覧

convert a string to an octal number
組込み関数一覧

find a character's numeric representation
組込み関数一覧

convert a list into a binary representation
組込み関数一覧

singly quote a string
組込み関数一覧

doubly quote a string
組込み関数一覧

flip a string or a list
組込み関数一覧

right-to-left substring search
組込み関数一覧

formatted print into a string
組込み関数一覧

get or alter a portion of a string
組込み関数一覧

transliterate a string
組込み関数一覧

return upper-case version of a string
組込み関数一覧

return a string with just the next letter in upper case
組込み関数一覧

transliterate a string
組込み関数一覧

msgctl msgget msgrcv msgsnd semctl semget semop shmctl shmget shmread shmwrite
組込み関数一覧

SysV IPC message control operations
組込み関数一覧

get SysV IPC message queue
組込み関数一覧

receive a SysV IPC message from a message queue
組込み関数一覧

send a SysV IPC message to a message queue
組込み関数一覧

SysV semaphore control operations
組込み関数一覧

get set of SysV semaphores
組込み関数一覧

SysV semaphore operations
組込み関数一覧

SysV shared memory operations
組込み関数一覧

get SysV shared memory segment identifier
組込み関数一覧

read SysV shared memory
組込み関数一覧

write SysV shared memory
組込み関数一覧

gmtime localtime time times
組込み関数一覧

convert UNIX time into record or string using Greenwich time
組込み関数一覧

convert UNIX time into record or string using local time
組込み関数一覧

return number of seconds since 1970
組込み関数一覧

return elapsed time for self and child processes
組込み関数一覧

endgrent endhostent endnetent endpwent getgrent getgrgid getgrnam getlogin getpwent getpwnam getpwuid setgrent setpwent
組込み関数一覧

be done using group file
組込み関数一覧

be done using hosts file
組込み関数一覧

be done using networks file
組込み関数一覧

be done using passwd file
組込み関数一覧

get next group record
組込み関数一覧

get group record given group user ID
組込み関数一覧

get group record given group name
組込み関数一覧

return who logged in at this tty
組込み関数一覧

get next passwd record
組込み関数一覧

get passwd record given user login name
組込み関数一覧

get passwd record given user ID
組込み関数一覧

prepare group file for use
組込み関数一覧

prepare passwd file for use