2011-08-23 21 views
14

私はサイモンCozensによってBeginning Perlを読んでいると第8章 - サブルーチン彼はprintopensplitなどが内蔵されている間に演算子や関数「サブルーチン」は、ユーザ関数であることを述べています。Perlビルトイン演算子/関数とは何ですか?

とはなんですか?それらは実際に組み込まれており、言語固有の機能(Cのsizeof演算子のような)ですか、実際はmainモジュールのサブルーチン/関数ですか?

サブルーチンの場合は、whileforunlessなどサブルーチンもありますか? +-eqなどの演算子はどうですか?

+3

私は 'perldoc perlfunc'と' perldoc -f 'を見ています。 –

+1

これは私の好きなperl演算子のリストです:http://www.ozonehouse.com/mark/periodic/ – Seth

+1

@Seth Perl 6のためのものです。(すべての目的と目的のために)Perl 5とは全く別の言語です。彼らが「Perl」と言ったとき、誰もが意味することです。 – jwodder

答えて

25

print,open,splitはサブルーチンではありません。彼らは副呼び出しをもたらさない。シンボルテーブルにも存在しません(など)。CORE::splitなどと呼んでも構いませんが、コードへの参照を取得できません(CORE::で代理サブを作成する作業が行われています)。あなたがそれらをサブルーチンとして扱いたいとき)。彼らは+のような演算子です。

$ perl -MO=Concise,-exec -e'sub f {} f()' 
1 <0> enter 
2 <;> nextstate(main 2 -e:1) v:{ 
3 <0> pushmark s 
4 <#> gv[*f] s 
5 <1> entersub[t3] vKS/TARG,1  <--- sub call 
6 <@> leave[1 ref] vKP/REFC 
-e syntax OK 

$ perl -MO=Concise,-exec -e'split /;/' 
1 <0> enter 
2 <;> nextstate(main 1 -e:1) v:{ 
3 </> pushre(/";"/) s/64 
4 <#> gvsv[*_] s 
5 <$> const[IV 0] s 
6 <@> split[t2] vK     <--- not a sub call 
7 <@> leave[1 ref] vKP/REFC 
-e syntax OK 

$ perl -MO=Concise,-exec -e'$x + $y' 
1 <0> enter 
2 <;> nextstate(main 1 -e:1) v:{ 
3 <#> gvsv[*x] s 
4 <#> gvsv[*y] s 
5 <2> add[t3] vK/2     <--- Just like this 
6 <@> leave[1 ref] vKP/REFC 
-e syntax OK 

彼らは様々な名前で知られている:

  • 組み込み関数
  • 機能
  • 組み込みコマンド
  • という名前のオペレーター

そして、ほとんどの一つであると考えられています以下のうち:

  • リスト演算子
  • (彼らはCやC++であるとして)

サブルーチンは、多くの場合、機能と呼ばれている単項演算子の名前なので、「機能」はあいまいな言葉です。このあいまいさは、あなたの質問の基礎と思われる。 whileについては


forunlessなど、彼らは、 "フロー制御文"

while (f()) { g() } 

と "文修飾子"

g() while f(); 
+1

あなたが投稿したコードは、PerlのVMが理解できるコード、perlインタープリタによって生成されたコードですか? – Raphael

+0

@Raphael、はい、これはプログラムをコンパイルした結果のオペコードツリーの表現です。 – ikegami

10

Perlキーワードは、Perlソースディストリビューション内のregen/keywords.plファイルに定義されています。これらは次のとおりである:

__FILE__、__LINE__、__PACKAGE__、__DATA__、__END__、AUTOLOAD、BEGIN、 UNITCHECK、CORE、DESTROY、END、INIT、CHECK、ABS、受け入れて、アラーム、 と、ATAN2、バインド、binmodeを ダイス、ブースト、ブレイク、呼び出し元、chdir、chmod chomp、chop、chown、chr、chroot、close、closedir、cmp、接続、 続行、cos、crypt、dbmclose、dbmopen、 endprotoent、endpwent、endservent、eof、eval、eval、exec、存在、 exit、exp、fcntl、fileno、flock、for、foreach、fork、for、foreground、フォーマット、フォームライン、 ge、getc、getgrent、getgr GID、getgrnam、のgethostbyaddrと、gethostbyname、 gethostent、にgetlogin、getnetbyaddr、getnetbyname、getnetent、 getpeername、のgetpgrp、getppid、getpriority、getprotobyname、 getprotobynumber、はgetprotoent、getpwent、のgetpwnam、getpwuid、 は、getservbyname、getservbyport、getservent、のgetsockname、 getsockopt、 、glob、gmtime、goto、grep、gt、hex、if、index、int、ioctl、 ローカル、localtime、 ローカル、localtime、キル、最後、lc、lcfirst、le、長さ、リンクmsg38、msgrc、msgsv、msg、msgrc、msgs、my、ne、next、no、not、oct、open、opendir、 or、our、pack、package 、パイプ、ポップ、ポスト、プリント、プリント、プロトタイプ、 プッシュ、q、qq、qr、クォートメータ、qw、qx、rand、read、readdir、 read、readpipe、recv、redo、ref、rename、require、reset、return、 reverse、rewinddir、rindex、rmdir、s、スカラー、シーク、seekdir、 select、semctl、semget、semop、send setpgrp、setpriority、setprotoent、setpwent、setservent、setsockopt、 shift、shmctl、shmget、shmread、shmwrite、シャットダウン、sin、sleep、 ソケット、ソケットペア、ソート、スプライス、スプリット、スプリント、スプリント、 syssten、システム、syswrite、tell、telldir、tie、tied、time、times、 tr、truncate、uc、ucfirstこのトピックについてのご意見・ご感想をEメールにてお寄せください。 、umask、undef、unlink、unpack、 unshift、unie、until、use、utime、values、vec、wait、waitpid、 wantarray、警告、when、while、write、x、xor、y。

perlsyn はperlop 、及びはperlsubマンページが必要とされる読み出しは、はperlfuncマニュアルページによっておそらく続きます。オブジェクトで使用される組み込み演算子をオーバーライドする方法については、オーバーロードマンページを参照してください。

+0

多くのキーワードで言語を見たことはありません! – Raphael

+0

@ラファエル:その後、COBOLを見ないでください。 ;) – musiKk

+3

@Raphael:あなたはおそらく、ifとか 'unless'のように、キーワードをオーバーライドできないものと考えています。 ** Perlはこれらの絶対的に無効なキーワードの数はほとんどありません** Perlの 'regen/keywords.pl'のキーワードの大部分は、実際には3つの方法のうちの1つ(またはそれ以上)によって上書きされます: ( 'chdir'や' open'のように)別のパッケージか、 '' keys''や 'pop''のように束縛するか、' 'print''、' 'cmp''、' 'qq''のように演算子のオーバーロードを行っています。どちらが理解するには言語の経験が必要です。 – tchrist

1

で使用されるキーワードは、ビルトイン演算子はPerlサブルーチンではありません。例えば、

#!/usr/bin/perl 

use strict; 
use warnings; 

sub Foo { print "In foo\n"; } 

my $ref; 

$ref = \&Foo; 
$ref->(); 

$ref = \&print; 
$ref->(); 

最初$ref->();間接コールです。 "In foo"を表示します。

もう一つは警告を生成します。サブルーチンの名前ではありません

Undefined subroutine &main::print called at ./tmp.pl line 14 

printので。

+1

fyi、 '\&CORE :: builtin'が5.16で追加されています。それは、組み込み関数を呼び出すサブを自動化します。 – ikegami

0

作成していない関数として「組み込み関数」と考えるだけです。簡単? :-)

+6

あなたはそれらを参照することはできません。あなたはプロトタイプと特殊な構文解析ルールを '&'で始めることでオーバーライドすることはできません。あなたはそれらに 'goto'することはできません。 (と私はいくつかが不足していると確信しています) – ikegami

関連する問題