Ich verstehe nicht, was könnte die Verwendung von Lvalue Subroutinen sein? Was kann ich mit normalen Subroutinen nicht erreichen? Könnten Sie bitte einige Beispiele veröffentlichen?Was sind die Lvalue Subroutinen in Perl?
Dank
Ich verstehe nicht, was könnte die Verwendung von Lvalue Subroutinen sein? Was kann ich mit normalen Subroutinen nicht erreichen? Könnten Sie bitte einige Beispiele veröffentlichen?Was sind die Lvalue Subroutinen in Perl?
Dank
Lvalues empfohlen vermieden werden. Sie sind lustig und alle, aber sie verwirren neue Benutzer, die Annahmen darüber machen, wie alle Subs arbeiten, und daher sollten sie im Code vermieden werden, wenn ein besserer Weg verfügbar ist.
Manchmal kann es sehr praktisch sein, ein LValue-Ergebnis zu verwenden, um schmutzige Arbeit zu erledigen.
substr($string, $start, $stop) = 'somevalue' # replaces the specified part of the substring.
Dies schließt jedoch auch die gleiche Sache:
substr($string, $start, $stop , 'somevalue');
Der Unterschied hier meist ist der ehemalige deutlich mehr Ausdruckskraft hat, wie es die Delegierten das Verhalten zu dem Code, den sie anstelle der verwendet Funktion selbst.
Zum Beispiel:
substr($string, $start, $stop) =~ s/a/b/g
Würden Sie benötigen
my $x = substr($string, $start, $stop);
$x =~ s/a/b/g/;
substr($string, $start, $stop, $x);
die ein bisschen böse zu tun ist.
Obwohl es hier noch eine weitere unangenehme Sache gibt, weil Sie darüber nachdenken müssen, ob diese Ersetzung mit $ x rückwirkend funktioniert, um die Zeichenfolge zu modifizieren oder nicht (weil substr ein LValue-Sub ist). Ich denke nicht, aber es ist mehrdeutig genug, dass ich das Handbuch überprüfen muss, um mich zu erinnern, ob es das tut oder nicht, und das ist schlecht.
Sie bieten eine andere Schnittstelle, dass unter bestimmten Umständen intuitiver sein kann. Im Gegensatz zu traditionellen Setter können Sie den Wert direkt ändern. Zum Beispiel
lvalue_sub($foo) =~ s/foo/bar/;
kann sauberer sein als
my $tmp = some_sub($foo);
$tmp =~ s/foo/bar/;
some_sub($foo, $tmp);
Sie können als Einrichter für Objektelemente verwenden lvalue subs:
sub x : lvalue {
my $self = shift;
$self->{x};
}
Dann später:
$foo->x = 5;
Dies kombiniert die Anschaulichkeit der Mitglieder direkt mit der Flexibilität der Einkapselung der Setter, bei Einstellung Sie möchten später ändern, wie das Objekt implementiert wird. Vergleichen Sie die folgenden herkömmlichen Methoden zum Festlegen von Elementen in Perl:
Intuitiv aber zerbrechlich; Was ist, wenn Sie ändern, wie $ foo implementiert wird?
$foo->{x} = 5;
Traditionelle Setter-Methode; keine Zuordnung Syntax verwenden, was beläuft sich auf eine Zuordnung:
$foo->set_x(5);
Natürlich haben lvalue Methoden nie wirklich von der Perl-Gemeinschaft angenommen wurde, und die Verwendung von L-Wert U-Boote ist „weird“ und was auch immer gewonnen werden würde Intuitivität würde durch die Fremdartigkeit von allem verloren gehen.
Beachten Sie, dass genau wie das [Handbuch] (https://perldoc.perl.org/perlsub.html#Lvalue-subroutines), mit Lvalue-Subs für Setter wie diese schließen die Möglichkeit aus, Eingaben zu validieren. Mit anderen Worten, die Verwendung von lvalue-Subs als Accessoren ist strikt weniger leistungsfähig als eine einfache Methode. –
Ich kann nicht für die Verwendung von ihnen viel in meinen normalen Perl-Zeug sprechen, aber sie werden ausgiebig in der Perl Data Language verwendet, wenn Sie Scheiben oder andere Unterabschnitte einer Piddle machen. Zum Beispiel:
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;
Wie viele Dinge in Perl, ist diese Funktion nicht viel über das gesamte Ökosystem verwendet, aber seine Verwendung zumindest in dieser Nische macht das Leben viel einfacher für die Benutzer von PDL.
Ich musste deine erste Antwort aufwerten! –
$ x enthält eine Kopie, keinen lvalue. Aber wenn Sie einen lvalue substr ala 'für (substr (...)) {' oder 'foo (substr (...))' aliasieren, können Sie mehr als eine Sache mit dem lvalue machen. – ysth
Ich habe Probleme, einige Ihrer Sätze zu verstehen: A) "ein LValue-Ergebnis zu verwenden, um schmutzige Arbeit zu erledigen." aber ich kann das im Beispiel nicht sehen - oder ich verstehe nicht, was Sie mit "einem LValue-Ergebnis" B) meinen, da es das Verhalten an den Code delegiert, der es anstelle der Funktion selbst verwendet. vielleicht geht es darum, nicht-Englisch zu sein, aber ich bin verwirrt über Bedeutungen von Pronomen hier –
und C) "weil Sie darüber nachdenken müssen, ob die Ersetzung dieser Substitution oder nicht mit $ x rückwirkend die Zeichenfolge ändert oder nicht" - zu unklar für mich, kann nicht einmal darauf hinweisen, wie genau ... –