Score:-1

ใน perl คำสั่ง "ระบบ" โดยใช้วัตถุทางอ้อม การเปลี่ยนเส้นทางไม่ทำงาน ต้องการความช่วยเหลือ

ธง ws

ฉันใช้ Kubuntu 20.04 เวอร์ชัน perl แสดงโดย perl -v เป็น

perl 5 เวอร์ชัน 30 เวอร์ชันย่อย 0 (v5.30.0) สร้างขึ้นสำหรับ x86_64-linux-gnu-thread-multi (พร้อมแพตช์ที่ลงทะเบียน 50 รายการ ดูที่ perl -V

ฉันเพิ่งทำการอัพเดต apt-get และด้วยตัวจัดการแพ็คเกจ Muon ฉันได้อัปเกรดแพ็คเกจ perl ที่ติดตั้งทั้งหมดแล้ว

แต่หลังจากนั้น perl ก็ 5 เหมือนเดิม ผมไม่มี perl 6

ปัญหาของฉันไม่ใช่เมื่อฉันใช้คำสั่งระบบอย่างง่ายเช่น

perl - เรา 'ระบบ ("echo \"aaa\" > /tmp/WEx_args_file"); '

ในกรณีนี้ ไฟล์ถูกเขียนขึ้น

แต่เมื่อใช้ทางอ้อมวัตถุเช่น

perl -we ' @WE_args = ( "echo", " \"qqq\" > /tmp/WEx_args_file" ); $WE_retcod_system = ระบบ { $WE_args[0] } @WE_args; พิมพ์ "WE_retcod_system: ~", $WE_retcod_system, "~\n"; if($WE_retcod_system != 0) { die "\nsystem >>>YYY>>>@WE_args<<<YYY<<< ล้มเหลว: $?"; }; '

ในกรณีนี้ ไฟล์ไม่ได้ถูกเขียน

เอาต์พุตที่แสดงบนหน้าจอ:

"qqq" > /tmp/WEx_args_file

แล้วตาม

WE_retcode_system: ~0~

ฉันได้ลองใช้วัตถุทางอ้อมในหลายรูปแบบทั้งวัน ฉันไม่พบรหัสที่จะเขียนไฟล์ tmp

ได้โปรด ใครรู้วิธีแก้ปัญหาบ้าง?

=====

ในการพยายามที่จะดำเนินการต่อไปฉันได้พบสิ่งที่ดีมาก

IPC::ระบบ::ง่าย

ด้วยวิธีนี้ ความตั้งใจของฉันคือการแทนที่รหัส backtick ของฉัน

เสียงสะท้อน -n "qqq" | xxd -g1

ด้วยฟังก์ชันแคปเจอร์เอ็กซ์ เช่น

perl -เราใช้ IPC::System::Simple qw/capturex/; open(FHo, ">/tmp/Wex_args_file") หรือตาย; $WE_got_from_cpx = capturex("echo", "-n", ""qqq"", "|", "xxd -g1" ); พิมพ์ FHo "WE_got_from_cpx: ~", $WE_got_from_cpx, "~\n"; '

เท่าที่ฉันเข้าใจ นี่คือการใช้แคปเจอร์เอ็กซ์ที่ถูกต้อง แต่ปัญหาใหม่มันไม่ทำงาน

คำสั่งบน RHS ของท่อ เช่น

xxd -g1

ไม่ได้ดำเนินการ แต่คัดลอกเท่านั้น ผลลัพธ์ที่ได้คือ

WE_got_from_cpx: ~"qqq" | xxd -g1~

ฉันเกรงว่าโมดูลเหล่านี้ใน IPC::System::Simple จะขึ้นอยู่กับจุดนำเช่น "วัตถุทางอ้อม" ซึ่งมีเพียงอาร์กิวเมนต์แรกเท่านั้นที่เป็นคำสั่งที่ดำเนินการ

ฉันจะใช้ IPC::System::Simple เพื่อทำให้ฟังก์ชัน backtick ทั้งหมดไปได้อย่างไร

ความนับถือ แอนตัน

muru avatar
us flag
เหตุใดคุณจึงส่ง `echo` เป็นอาร์กิวเมนต์ด้วยตัวเอง แต่รวม `"qqq" > /tmp/WEx_args_file` เป็นอาร์กิวเมนต์เดียว
Anton Wessel avatar
ws flag
วิธีที่แนะนำเรียกว่า "วัตถุทางอ้อม" หมายความว่าคำสั่งที่จะดำเนินการเขียนในรูปแบบดังกล่าว: ต้อง b
Anton Wessel avatar
ws flag
วิธีที่แนะนำที่เรียกว่า "ออบเจกต์ทางอ้อม" หมายความว่าคำสั่งที่จะดำเนินการนั้นเขียนในรูปแบบดังกล่าว: ต้องเป็นแบบก่อนหน้าก่อนรายการตามด้วยรายการคำสั่ง "รายการระบบ" การเขียนขั้นกลางทั้งหมดไม่ทำงาน ยกเว้นเมื่อลดขนาดเป็นกรณีแรกของฉันเพียงแค่ system()
raj avatar
cn flag
raj
เมื่อใช้ไวยากรณ์ของอ็อบเจกต์ทางอ้อม คุณกำลังส่ง `"qqq" > /tmp/WEx_args_file` เป็นสตริงอาร์กิวเมนต์ไปยังคำสั่ง `echo` ดังนั้นจึงไม่น่าแปลกใจที่คำสั่งจะพิมพ์ออกมาอย่างนั้น ในเวอร์ชันง่าย อาร์กิวเมนต์จะเป็น `\"aaa\"` เท่านั้น การเปลี่ยนเส้นทาง (`> /tmp/WEx_args_file`) คือ **ไม่ใช่** ส่วนหนึ่งของสตริงอาร์กิวเมนต์ มันถูกจัดการโดยเชลล์ก่อนที่จะส่งอาร์กิวเมนต์ไปยังคำสั่ง คุณต้องหาวิธีจัดการการเปลี่ยนเส้นทางโดยใช้ไวยากรณ์ของวัตถุทางอ้อม นี่อาจเป็นเรื่องยุ่งยาก หากเป็นไปได้เลย อาจเกี่ยวข้องกับการดำเนินการบางอย่างในตัวอธิบายไฟล์ ฉันขอแนะนำให้ถาม StackOverflow สำหรับสิ่งนั้น

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา