chop
(以下を参照してください) です。$/ (English
モジュールでは、$INPUT_RECORD_SEPARATORとも言う) のその時点の値に対応す
る行末文字を削除します。削除した文字数を返します。入力レコードから、改行
を削除したいのだけれど、最後のレコードには改行が入っているのかわからない
ような場合に、使用することができます。段落モード ($/ = "") では、レコー
ドの最後の改行をすべて取り除きます。variable が省略されると、$_ を
対象として chomp
します。例:
while (<>) { chomp; # 最後のフィールドの \n を避ける @array = split(/:/); ... }
左辺値であれば、代入を含めて、任意のものを chomp
できます:
chomp($cwd = `pwd`); chomp($answer = <STDIN>);
リストを chomp
すると、個々の要素が chomp
され、削除された
文字数の合計が返されます。
chop
します。例:
while (<>) { chop; # 最後のフィールドの \n を避ける @array = split(/:/); ... }
左辺値であれば、代入を含めて、任意のものを chop
できます:
chop($cwd = `pwd`); chop($answer = <STDIN>);
リストを chop
すると、個々の要素が chop
されます。最後の
chop
の値だけが返されます。
プログラムを実行する人が、自分のパスワードを知っていることを確認する例で す:
$pwd = (getpwuid($<))[1]; $salt = substr($pwd, 0, 2); system "stty -echo"; print "Password: "; chop($word = <STDIN>); print "\n"; system "stty echo"; if (crypt($word, $salt) ne $pwd) { die "Sorry...\n"; } else { print "ok\n"; }
もちろん、聞かれれば、誰にでもパスワードを打ってあげるなんてのは、もって のほかです。
構文エラーや実行エラーが発生するか、die()
文が実行されると、
eval()
の値として未定義値が返され、$@ にエラーメッセージが設定さ
れます。エラーがなければ、$@は、空文字列であることが保証されます。EXPR
を省略すると、$_ を評価します。最後のセミコロンは、式から省くことができ
ます。
eval()
は、致命的エラーとなるようなものをトラップすることができま
すから、(dbmopen()
や symlink()
といった) 特定の機能がイン
プリメントされているかを、調べるために使うことができます。die 演算子が例
外を発生させるものとすれば、これはまた、Perl の例外捕捉機能と捉えること
もできます。
実行するコードが変わらないのであれば、毎回多量の再コンパイルすることなし に、実行時エラーのトラップを行なうために、eval-BLOCK 形式を使うことがで きます。エラーがあれば、やはり $@ に返されます。例:
# 0 除算を致命的でなくす eval { $answer = $a / $b; }; warn $@ if $@; # 効率的ではないが、同じ eval '$answer = $a / $b'; warn $@ if $@; # コンパイル時エラー eval { $answer = }; # 実行時エラー eval '$answer ='; # $@ を設定
eval() では、何が調べられるかに、特に注意しておくこ とが必要です:
eval $x; # CASE 1 eval "$x"; # CASE 2 eval '$x'; # CASE 3 eval { $x }; # CASE 4 eval "\$$x++" # CASE 5 $$x++; # CASE 6
上記の CASE 1 と CASE 2 の動作は同一で、変数 $x 内のコードを実行します。 (ただし、CASE 2 では、必要のないダブルクォートによって、読む人が何が起こ るか混乱することでしょう (何も起こりませんが)。)同様に CASE 3 と CASE 4 の動作も等しく、何もしない「$x」というコードを実行します。(純粋に見た目 の問題で、CASE 4 が好まれます。)CASE 5 の場合は、通常ダブルクォートを使 用します。この状況を除けば、CASE 6 のように、単にシンボリックリファレン スを使えば良いでしょう。
substr()
を左辺値として
使用することも可能で、その場合には、expr が左辺値でなければなりま
せん。len より短いものを代入したときには、expr は短くなり、
len より長いものを代入したときには、expr はそれに合わせて伸
びることになります。expr の長さを一定に保つためには、
sprintf()
を使って、代入する値の長さを調整することが、必要になる
かもしれません。
Go to the first, previous, next, last section, table of contents.