Puncte:-1

în perl, comanda „sistem”, folosind obiect indirect, redirecționarea nu funcționează, are nevoie de ajutor

drapel ws

Rulez Kubuntu 20.04. Versiunea perl este indicată de perl -v ca fiind

perl 5, versiunea 30, subversiune 0 (v5.30.0) construită pentru x86_64-linux-gnu-thread-multi (cu 50 de corecții înregistrate, vezi perl -V

Tocmai am făcut update-ul apt-get și cu managerul de pachete Muon am actualizat toate pachetele perl instalate.

Dar după aceea, perl este 5 ca înainte, nu am perl 6.

Problema mea nu este atunci când folosesc comanda simplă de sistem, cum ar fi

perl -we 'system("echo \"aaa\" > /tmp/WEx_args_file"); '

În acest caz dosarul este scris.

Dar când folosești modul de obiect indirect, cum ar fi

perl -we ' @WE_args = ( "eco", " \"qqq\" > /tmp/WEx_args_file" ); $WE_retcod_system = sistem { $WE_args[0] } @WE_args; printează „WE_retcod_system: ~”, $WE_retcod_system, „~\n”; if($WE_retcod_system != 0) { die "\nsystem >>>YYY>>>@WE_args<<<YYY<<< failed: $?"; }; '

în acest caz dosarul nu este scris.

Ieșirea afișată este pe ecran:

"qqq" > /tmp/WEx_args_file

apoi urmează

WE_retcode_system: ~0~

Am încercat modul de obiect indirect în multe variante o zi întreagă. Nu am găsit un cod pentru a fi scris fișierul tmp.

Va rog, stie cineva o solutie?

=====

În încercarea de a continua, am găsit foarte bine

IPC::Sistem::Simplu

Prin aceasta, intenția mea este să-mi înlocuiesc codul de backtick

echo -n "qqq" | xxd -g1

cu funcția capturex, cum ar fi

perl -folosim IPC::System::Simple qw/capturex/; deschide(FHo, ">/tmp/Wex_args_file") sau die; $WE_got_from_cpx = capturex("echo", "-n", ""qqq"", "|", "xxd -g1" ); printează FHo "WE_got_from_cpx: ~", $WE_got_from_cpx, "~\n"; '

Din câte am înțeles, aceasta este utilizarea corectă a capturex. Dar noua problema, nu merge.

Comanda pe RHS a conductei, i.e.

xxd -g1

nu este executat ci doar copiat. Rezultatul este

WE_got_from_cpx: ~"qqq" | xxd -g1~

Mi-e teamă că aceste module din IPC::System::Simple se bazează pe punctul de conducere, cum ar fi „obiectul indirect”, modul în care doar primul argument este comanda executată.

Cum pot folosi IPC::System::Simple pentru a face întreaga funcție de backtick?

Salutari anton

muru avatar
drapel us
De ce ați trecut `echo` ca argument în sine, dar ați combinat `"qqq" > /tmp/WEx_args_file` într-un singur argument?
Anton Wessel avatar
drapel ws
Modul recomandat, așa-numitul „obiect indirect” implică faptul că comanda de executat este scrisă într-un astfel de format: trebuie b
Anton Wessel avatar
drapel ws
Modul recomandat, așa-numitul „obiect indirect” implică faptul că comanda de executat este scrisă într-un astfel de format: trebuie să fie ca predecesor înaintea listei care urmează, lista de comenzi „listă sistem”. Toate scrierile intermediare nu funcționează, cu excepția cazului în care sunt reduse la primul meu caz de simplu sytem().
raj avatar
drapel cn
raj
Folosind sintaxa obiectului indirect, treceți `"qqq" > /tmp/WEx_args_file` ca șir de argument la comanda `echo`, deci nu e de mirare că comanda tipărește exact asta. În versiunea simplă, argumentul este doar `\"aaa\"`. Redirecționarea (`> /tmp/WEx_args_file`) **nu** face parte din șirul de argument; este gestionat de shell înainte ca argumentele să fie transmise comenzii. Trebuie să găsiți o modalitate de a gestiona redirecționarea folosind sintaxa obiectului indirect; acest lucru poate fi dificil, dacă este posibil, va implica probabil unele operații asupra descriptorilor de fișiere. Vă sugerez să întrebați pe StackOverflow pentru asta.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.