gelöst:qw - und seine Abwandlungen - was ist das genau?

Begonnen von Wuppi68, 02 April 2020, 10:29:29

Vorheriges Thema - Nächstes Thema

Wuppi68

ich hätte da auch mal eine Frage ;-)

was macht eigentlich genau das qw -quote word - und seine Abarten? Und wie setzt man das "Abkürzungsmakro" sinnvoll ein? Aufgrund der sehr schreibfaulen Kürze findet google leider auch keine für mich passenden Erklärungen ;-)

aus dem Speckerleckfred kommt z.B. folgendes Konstrukt: use Scalar::Util qw( refaddr ); und dieses sprengt wieder mein Baujahr 68er Hirn

Wirklich fragend

Ralf
FHEM unter Proxmox als VM

herrmannj

Qw steht für quoted word.
https://perlmaven.com/qw-quote-word

Die Verwendung im use heist übersetzt: importiere die Funktion refaddr

RichardCZ

Man könnte meinen, qw sei für die Schreibfaulen.

anstatt

@x = ('tralala', 'foo', 'bar', 'baz');

geht eben

@x = qw(tralala foo bar baz);

ok, da muss man weniger tippen, aber es wird auch übersichtlicher, dieser ganze Apostroph und Komma-Friedhof rauscht schon ganz schön.
qw loht sich eigentlich schon ab dem ersten Element, denn die zwei Apostrophe die man sich spart entsprechen dem 'qw'. Es wird aber besser:

@x = ('Richard\'s', 'Perl', 'Fragestunde');

Larry Wall sprach mal vom "Leaning Toothpick Syndrome"

@x = qw(Richard's Perl Fragestunde);

Kein Vorteil ohne Nachteil. Interpolation geht halt in qw nicht:

@x = qw(blah $tralala blubb);

ist das $tralala eben verbatim und nicht etwa der inhalt einer variable $tralala.

PS: Es gibt keine "Abwandlungen" von qw. q, qq, qr, qx machen allesamt was anderes.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

Wuppi68

Zitat von: RichardCZ am 02 April 2020, 10:47:12
PS: Es gibt keine "Abwandlungen" von qw. q, qq, qr, qx machen allesamt was anderes.

und genau diese vielen q[qwrx] haben in meinem Kopf Nebelbomben gezündet ;-)
gibt es dafür ein Spickzettel auf Deutsch? Englisch ist grundsätzlich kein Problem - ich brauche die Deutsche Erklärungen halt zum entnebeln.

@hermannj: Danke, das war auch mein Verständnis - und wollte es mit meiner Frage manifestieren ;-)

Danke für die Infos

Ralf
FHEM unter Proxmox als VM

Beta-User

Zu den "echten" q- (Quote)-Varianten hatte ich neulich schon das hier verlinkt:

https://www.perlmonks.org/?node_id=401006

qx ist meines Wissens nach wieder was anderes: Systemaufruf mit bestimmten Rahmenbedingungen, wäre gesondert zu suchen.
(qr: k.a. im Moment, auch nicht gesucht).

Da wir aber hier eigentlich beim q (=Quote) sind @hermannj: vermutlich habe ich den Lösungsansatz für's verstecken gefunden :) . Das muß innerhalb der Klammern in - ja genau - Quotes, denke ich... Teste ich bei Gelegenheit ::) .

$hash->{'.typeMappings'} = ...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

RichardCZ

Zitat von: Wuppi68 am 02 April 2020, 11:02:32
gibt es dafür ein Spickzettel auf Deutsch? Englisch ist grundsätzlich kein Problem - ich brauche die Deutsche Erklärungen halt zum entnebeln.

https://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

herrmannj

#6
vmtl lautet eine Deiner Anschlußfragen, warum und wann braucht man so etwas.


Beispiel: q{} welches ja die Ersetzung für ' ' ist.


Im JsonMod kann der user eine jsonPath Expression angeben um auf Elemente des JSON geziehlt zugreifen zu können.

Den Ausdruck schreibt man in ein Attribut in Hochkommas. Doppelte Hochkommas würde interpolieren (das '$' ist part der jsonPath Expression hat aber auch in perl selbst eine Bedeutung). Also einfache Hochkommas:
jsonPath('$.foo')
Jetzt kann es aber passieren das _in_ der jsonPath Expression Hochkommas benötigt werden. Filter zum Beispiel. Dann muss der ganze Ausdruck in doppelte Hochkommas gestellt werden und in der Folge muss '$' und '@' maskiert (escaped) werden:
jsonPath("\$.foo[?(\@.blub == 'bar')]")
wenn man an dieser Stelle jedoch q{} verwendet, kann man sich das escapen sparen
jsonPath(q{$.foo[?(@.blub == 'bar')]})
Welche der Möglichkeiten schöner sind liegt dann im Auge des Betrachters (wobei ich nicht asuchließen möchte das PBP da eine Meinung zu hat;))




RichardCZ

Zitat von: herrmannj am 02 April 2020, 11:39:46
Welche der Möglichkeiten schöner sind leigt dann im Auge des Betrachters (wobei ich nicht asuchließen möchte das PBP da eine Meinung zu hat;))


jsonPath("\$.foo[?(\@ == 'bar')]")
jsonPath(q{$.foo[?(@ == 'bar')]})


PBP hat auf Seite 51/52 die eindeutige Meinung, dass letzteres wesentlich besser ist. Vielleicht könnte man in dem Fall das ein oder andere Leerzeichen spenden, weil 4 schliessende Klammern unterschiedlicher Couleur aneinandergepappt dann doch ein wenig heftig sind.


jsonPath( q{$.foo[?(@ == 'bar')]} )


Oder tatsächlich den "literal value" auslagern:


my $json_foo = q{$.foo[?(@ == 'bar')]};
jsonPath($json_foo)


Aber ansonsten so halt.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

Wuppi68

Zitat von: RichardCZ am 02 April 2020, 11:17:00
https://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators

Genau solches habe ich gesucht ;-) So geht es auch auf Englisch ;-)

@herrmannj: verstanden

Was ist der Unterschied zwischen tr{}{}und y{}{}?
FHEM unter Proxmox als VM

RichardCZ

Zitat von: Wuppi68 am 02 April 2020, 11:59:07
Genau solches habe ich gesucht ;-) So geht es auch auf Englisch ;-)

@herrmannj: verstanden

Was ist der Unterschied zwischen tr{}{}und y{}{}?

Zitat# tr (y is a psedonym - from the "y" operator is sed) do a
# character by character translation.

Pseudonym, Synonym, ...

y war zwar zuerst da, aber kann sich keiner was drunter vorstellen. also lieber tr (=transliterate, oder auch "translate" wer will)
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

Wuppi68

Zitat von: RichardCZ am 02 April 2020, 12:27:27
y war zwar zuerst da, aber kann sich keiner was drunter vorstellen. also lieber tr (=transliterate, oder auch "translate" wer will)

was liebe ich da den Preprozessor in C mit seinem #define

und da soll jemand durchsteigen, der nur sich mit Perl anfreundet, da FHEM es zwingend benötigt

@All: Dank für die Perl Ecke
FHEM unter Proxmox als VM

RichardCZ

Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

Wuppi68

Zitat von: RichardCZ am 02 April 2020, 15:16:52
so etwa?

https://www.reddit.com/r/programminghorror/comments/ffa93r/ifdef_horror/

naja, so ein paar Kommentare wären hilfreich in diesem Beispiel :-)

Wozu gibt es die Lernkurve? Mit diesem Fred ist mein Verständnis für Perl wieder deutlich gestiegen ;-)
FHEM unter Proxmox als VM