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 で宣言した変数はレキシカルスコープであるものの次にサブルーチンが呼ばれたときも値を憶えています。
同じサブルーチンを呼出しても、スカラーが戻ることを期待している文脈(スカラーコンテキスト)と、リストが戻ることを期待している文脈(リストコンテキスト)の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