Perlで左辺値サブルーチンの用途は何ですか?
-
21-08-2019 - |
質問
私は左辺値サブルーチンの使い方何ができるか理解していませんか?それは私が通常のサブルーチンを達成できないことは何ですか?あなたはいくつかの例を投稿してくださいもらえますか?
おかげ
解決
左辺値を回避することが推奨されています。彼らは楽しさと、すべてのだが、良い方法が利用可能になったときのコードで、彼らはすべての潜水艦がどのように機能するかについての仮定を行う新しいユーザーを混乱させるため、それは避けるべきです。
時にはそれが汚い仕事をするために左辺値の結果を利用するには極めて実用的なことができます。
substr( $string, $start, $stop ) = 'somevalue' # replaces the specified part of the substring.
しかし、これはまた同じことを行います:
substr( $string, $start, $stop , 'somevalue' );
ここでの違いは、主に前者は代わりに関数自体のそれを使用するコードに委譲挙動として、かなり多くの表現力を有しています。
たとえばます:
substr( $string, $start, $stop ) =~ s/a/b/g
行うためにあなたを必要とする
my $x = substr( $string, $start, $stop );
$x =~ s/a/b/g/;
substr( $string, $start, $stop, $x );
ビット厄介ですどちらます。
が、あなたは、xが文字列または(左辺値のサブさSUBSTRによる)でないを変更するために遡及的に動作します$でその置換を行うかどうかについて考える必要があるため、追加の厄介は、ここにあります。私はそれがないとは思いませんが、十分にそのあいまいな私はそれがないかどうかを覚えておくことは、マニュアルを確認する必要があり、それは悪いです。
他のヒント
あなたは、オブジェクトのメンバーのためのセッターとして左辺値サブルーチンを使用することができます:
sub x : lvalue {
my $self = shift;
$self->{x};
}
次に、後でます:
$foo->x = 5;
後でオブジェクトが実装されている方法を変更したい場合には、これは、セッターをカプセル化の柔軟性と直接メンバーを設定する直観を兼ね備えています。 Perlでメンバーを設定するには、次のより伝統的な方法と比較ます:
直感的なものの壊れやすいです。何を変更した場合は$ fooが実装されているか?
$foo->{x} = 5;
伝統的なセッターメソッド。割り当てに相当するもののために割り当ての構文を使用していません。
$foo->set_x(5);
もちろん、左辺値の方法は本当にPerlコミュニティに受け入れされていなかった、と左辺値潜水艦の使用は「奇妙」であると何でも直感のために獲得されるだろうが、それをすべての奇妙によって失われてしまう。
これらは、いくつかの状況で、より直感的にすることができ、別のインターフェイスを提供します。伝統的なセッターとは異なり、実際に値を直接変更することができます。たとえば、
lvalue_sub($foo) =~ s/foo/bar/;
タグよりもきれいにすることができます
my $tmp = some_sub($foo);
$tmp =~ s/foo/bar/;
some_sub($foo, $tmp);
私はずっと私の通常のPerlのものでそれらを使用するために話すことはできませんが、スライスやおしっこの他のサブセクションを取るときには、Perlデータ言語で広く使用されています。たとえばます:
my $a = sequence(100);
# use lvalue in this increment:
$a->where($a < 10)++;
# Zero-out the last four elements
# notice the use of the overloaded .= operator:
$a->slice("-10:") .= 0;
はPerlで多くのものと同様、この機能は全体のエコシステム全体であまり使われませんが、少なくとも、このニッチ市場での使用が人生を作るのPDLのユーザーのための非常にの容易になります。