คำถามติดแท็ก perl

Perl เป็นภาษาการเขียนโปรแกรมแบบไดนามิกระดับสูงที่มีวัตถุประสงค์ทั่วไปตีความ เดิมพัฒนาโดย Larry Wall เป็นภาษาสคริปต์ Unix วัตถุประสงค์ทั่วไปเพื่อให้การประมวลผลรายงานง่ายขึ้นในช่วงเวลาที่ได้รับการสนับสนุนจากชุมชนโอเพ่นซอร์สมันได้พัฒนาและครบกำหนดเพื่อใช้สำหรับการเขียนโปรแกรมกราฟิกการบริหารระบบการเขียนโปรแกรมเครือข่ายการเงิน ชีวสารสนเทศศาสตร์และการประยุกต์ด้านวิศวกรรมอื่น ๆ

9
การใช้ "ในขณะที่จริง" เพื่อให้สคริปต์มีชีวิตอยู่เป็นความคิดที่ดี?
ฉันแค่กระโดดเข้าสู่ยูนิกซ์จากโลกที่แตกต่างและอยากรู้ว่า while true do /someperlscript.pl done สคริปต์ perl ภายในมีโฟลเดอร์ / ตัวเฝ้าดูไฟล์ที่ดำเนินการเมื่อไฟล์ถูกเปลี่ยนในตำแหน่งเป้าหมาย นี่while trueเป็นความคิดที่ดีหรือไม่? ถ้าไม่เป็นวิธีการที่แข็งแกร่งที่ต้องการคืออะไร? TIA แก้ไข: เนื่องจากสิ่งนี้ดูเหมือนว่าจะสร้างความสนใจพอสมควรนี่เป็นสถานการณ์ที่สมบูรณ์ สคริปต์ perl ตัวเองดูไดเรกทอรีโดยใช้ตัวตรวจสอบไฟล์ เมื่อได้รับไฟล์ใหม่ (พวกเขามาถึงทาง rsync) มันจะรับไฟล์ใหม่และดำเนินการ ตอนนี้ไฟล์ที่เข้ามาอาจเสียหาย (อย่าถาม .. มาจาก raspberry pi) และบางครั้งกระบวนการอาจไม่สามารถจัดการกับมันได้ ฉันไม่รู้ว่าทำไมเพราะเรายังไม่ได้ตระหนักถึงสถานการณ์ทั้งหมด แต่ - หากกระบวนการล้มเหลวด้วยเหตุผลบางอย่างเราต้องการให้มันทำงานและจัดการกับไฟล์ถัดไปเพราะไฟล์ถัดไปไม่เกี่ยวข้องอย่างสมบูรณ์กับไฟล์ก่อนหน้าซึ่งอาจทำให้เกิดข้อผิดพลาด โดยปกติฉันจะใช้การจับบางอย่างและห่อโค้ดทั้งหมดไว้รอบ ๆ เพื่อไม่ให้เกิดปัญหา แต่ก็ไม่แน่ใจเรื่อง Perl จากสิ่งที่ฉันเข้าใจการใช้สิ่งต่าง ๆ เช่น supervisord เป็นวิธีการที่ดีสำหรับสิ่งนี้
19 shell  perl 

2
จะทราบสาเหตุของกระบวนการที่จะเข้าสู่โหมดสลีปและปลุกมันได้อย่างไร?
เมื่อฉันทำ 'บน' ฉันเห็นกระบวนการสคริปต์ของฉันในสถานะ 'S' มีวิธีที่จะรู้หรือไม่สิ่งที่ทำให้กระบวนการ perl นี้อยู่ในสถานะสลีปและวิธีที่จะปลุกมันขึ้นมา? วิธีใด ๆ ในการดีบักเพื่อให้ข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับบรรทัดในสคริปต์ Perl ทำให้มันอยู่ในสถานะ 'S'

3
ฉันจะติดตั้ง perldoc บน Ubuntu ได้อย่างไร
Ubuntu 10.10 มาพร้อมกับ Perl 5.10.1 ที่ติดตั้งไว้ล่วงหน้า แต่น่าแปลกที่perldocไม่ได้เป็นส่วนหนึ่งของแพ็คเกจ $ perldoc You need to install the perl-doc package to use this program. ฉันจะทำให้คุณสมบัตินี้ใช้งานได้อย่างไร

7
ทำซ้ำแต่ละบรรทัดหลายครั้ง
ต้องการให้แต่ละบรรทัดในไฟล์ซ้ำกันหลายครั้ง เช่นให้แต่ละบรรทัดทำซ้ำสี่ครั้ง: a b c กลายเป็น: a a a a b b b b c c c c ฉันได้ทำการค้นหาแล้วและมีคำถามและคำตอบมากมายในแนวของการย้อนกลับเช่นการรวมบรรทัดที่ซ้ำกันเป็นบรรทัดเดียว มันง่ายที่จะทำใน C แต่ฉันหวังว่าฉันจะรู้มากขึ้นเกี่ยวกับคำสั่งดั้งเดิมดังนั้นฉันจึงไม่ต้องหันไปใช้วิธีการโยนครั้งเดียวแบบนี้ตลอดเวลา

4
วิธีการเปิดเทอร์มินัลแยกไปที่เทอร์มินัล 9 รายการและสลับระหว่างกันโดยใช้หนึ่งสคริปต์
ฉันต้องการเปิดเทอร์มินัลแยกออกเพื่อให้บอกว่ามี 9 ส่วน (3x3) และรันสคริปต์ทุบตี แต่สำหรับเทอร์มินัลแต่ละส่วนจะมีสคริปต์ที่แตกต่างกัน สิ่งนี้สามารถทำได้โดยใช้ Perl, Python หรือแม้กระทั่งทุบตี? ฉันจะสลับระหว่างเทอร์มินัลตัวเล็ก ๆ เหล่านั้นโดยไม่ใช้แป้นพิมพ์ลัดได้อย่างไร terminatorโอ้โดยวิธีการที่ผมใช้ และถ้ามีเทอร์มินัลอีมูเลเตอร์อื่นที่เปิดใช้งานฟังก์ชั่นนี้มันคืออะไร?

3
แทนที่สตริงหลายบรรทัดในไฟล์
ฉันมีไฟล์จำนวนหนึ่งที่ฉันต้องการอัปเดตโดยแทนที่สตริงหลายบรรทัดหนึ่งด้วยสตริงอื่นหลายบรรทัด บางสิ่งบางอย่างตาม: * Some text, * something else * another thing และฉันต้องการแทนที่ด้วย: * This is completely * different text ผลที่ตามมาก็คือหลังจากการแทนที่ไฟล์ที่มีบล็อกแรกของข้อความตอนนี้จะมีสตริงที่สอง (ส่วนที่เหลือของไฟล์ไม่เปลี่ยนแปลง) ส่วนหนึ่งของปัญหาคือฉันต้องค้นหารายชื่อไฟล์ที่จะอัพเดทในระบบไฟล์ ฉันเดาว่าฉันสามารถใช้ grep สำหรับสิ่งนั้นได้ (แม้ว่าจะไม่ใช่เรื่องง่ายที่จะทำกับสตริงหลายบรรทัด) จากนั้นลองใช้ greid หรือไม่? มีวิธีง่าย ๆ ในการทำเช่นนี้? Sed เป็นตัวเลือก แต่มันน่าอึดอัดใจเพราะฉันต้องเพิ่ม \ n ฯลฯ มีวิธีที่จะพูดว่า "รับอินพุตจากไฟล์นี้จับคู่กับไฟล์เหล่านั้นจากนั้นแทนที่ด้วยเนื้อหาของไฟล์อื่นนี้" หรือไม่? ฉันสามารถใช้ python ถ้าจำเป็น แต่ฉันต้องการบางสิ่งที่รวดเร็วและง่ายดายดังนั้นหากมียูทิลิตีที่มีอยู่ฉันอยากจะใช้สิ่งนั้นมากกว่าเขียนสคริปต์ของตัวเอง (ซึ่งฉันรู้วิธีการทำ)

2
ฉันจะตรวจสอบว่า PID ที่ระบุกำลังทำงานอยู่ได้อย่างไร
ฉันกำลังเขียนสคริปต์ Perl ที่แยกวิเคราะห์ logfiles เพื่อรวบรวม PID แล้วตรวจสอบว่า PID นั้นทำงานอยู่หรือไม่ ฉันพยายามคิดวิธีที่ดีที่สุดในการตรวจสอบ เห็นได้ชัดว่าฉันสามารถทำสิ่งที่ชอบ: system("ps $pid > /dev/null") && print "Not running\n"; อย่างไรก็ตามฉันต้องการหลีกเลี่ยงการเรียกระบบถ้าเป็นไปได้ ฉันจึงคิดว่าฉันสามารถใช้/procระบบไฟล์ได้ (ความสะดวกในการพกพาไม่ใช่เรื่องที่น่ากังวลนี่จะทำงานบนระบบ Linux เสมอ) ตัวอย่างเช่น: if(! -d "/proc/$pid"){ print "Not running\n"; } ปลอดภัยไหม ฉันสามารถเดาได้หรือไม่ว่าหากไม่มี/proc/$pid/ไดเรกทอรี PID ที่เกี่ยวข้องไม่ทำงานอยู่ ฉันคาดหวังเช่นนั้นเนื่องจาก AFAIK psเองได้รับข้อมูลจากตัวเอง/procแต่เนื่องจากเป็นรหัสการผลิตฉันจึงต้องการให้แน่ใจ ดังนั้นจะมีกรณีที่กระบวนการทำงานไม่มี/proc/PIDไดเรกทอรีหรือมี/proc/PIDไดเรกทอรีอยู่และกระบวนการไม่ทำงานหรือไม่ มีเหตุผลใดที่ต้องการแยกวิเคราะห์psมากกว่าการตรวจสอบการมีอยู่ของไดเรกทอรีหรือไม่?

4
เปรียบเทียบสองคอลัมน์ของไฟล์ต่างกันและพิมพ์ถ้ามันตรงกัน
ฉันใช้ Solaris 10 และตัวเลือก grep ที่เกี่ยวข้องกับ -f ไม่ทำงาน ฉันมีไฟล์สองไฟล์ที่คั่นด้วย pipe: file1: abc|123|BNY|apple| cab|234|cyx|orange| def|kumar|pki|bird| ไฟล์ 2: abc|123| kumar|pki| cab|234 ฉันต้องการเปรียบเทียบสองคอลัมน์แรกของ file2 กับ file1 (ค้นหาเนื้อหาทั้งหมดของ file1 ในสองคอลัมน์แรก) หากตรงกับพิมพ์บรรทัดที่ตรงกันของ file1 จากนั้นค้นหาบรรทัดที่สองของไฟล์ 2 และอื่น ๆ ผลลัพธ์ที่คาดหวัง: abc|123|BNY|apple| cab|234|cyx|orange| ไฟล์ที่ฉันมีมีขนาดใหญ่มากมีประมาณ 400,000 บรรทัดดังนั้นฉันต้องการทำให้การดำเนินการเป็นไปอย่างรวดเร็ว

5
ฉันจะแปลงการประทับเวลาในคอลัมน์เป็นวันที่ได้อย่างไร
ฉันมีไฟล์ที่มีสิ่งนี้: 1415602803,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22 1415602807,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22 1415602811,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22 1415602815,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22 ฉันต้องการแปลงเวลาเป็นวันที่ในรูปแบบนี้: 2014-11-10 02:00:03,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22 2014-11-10 02:00:07,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22 2014-11-10 02:00:11,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22 2014-11-10 02:00:15,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22 ฉันจะทำสิ่งนั้นได้อย่างไร ฉันรู้ว่างานนี้: perl -pe 's/(\d+)/localtime($1)/e'(จากคำถามนี้ ) Mon Nov 10 02:00:03 2014แต่รูปแบบออกเป็น ฉันรู้ว่าคำสั่งนี้สามารถแปลงการประทับเวลาเป็นผลลัพธ์ที่ต้องการ: date -d@1415602803 +"%F %H:%M:%S"แต่ฉันไม่สามารถawkใช้งานได้system("cmd")เนื่องจากการใช้ใบเสนอราคาและอะไรก็ตาม

5
ลบบรรทัดที่ซ้ำกันในขณะที่รักษาลำดับของบรรทัด
[root@server]# awk '!seen[$0]++' out.txt > cleaned awk: (FILENAME=out.txt FNR=8547098) fatal error: internal error Aborted [root@server]# "" เซิร์ฟเวอร์ "" มี: 8 GByte RAM + 16 GByte SWAP, x> 300 GByte พื้นที่ว่าง, amd64, CPU ของเดสก์ท็อป ลินุกซ์ทางวิทยาศาสตร์ 6.6 ไม่มีอะไรอื่นที่จะทำเพื่อให้โหลด อ๊ะยกเลิกหลังจากนั้นสองสามวินาที .. out.txt คือ ~ 1.6 GByte GNU Awk 3.1.7 คำถาม : ฉันจะลบบรรทัดที่ซ้ำกันในขณะที่รักษาลำดับของบรรทัดได้อย่างไร ตัวพิมพ์เล็กก็สำคัญเช่นกัน: …


7
วิธีลบบรรทัดว่างหลายบรรทัดออกจากไฟล์ได้อย่างไร
ฉันมีบางข้อความไฟล์ผมใช้ในการจดบันทึกใน - cat >> fileข้อความธรรมดาเพียงมักจะเพียงแค่ใช้ บางครั้งฉันใช้บรรทัดว่างหรือสอง (แค่กลับ - ตัวอักษรขึ้นบรรทัดใหม่) เพื่อระบุหัวเรื่อง / บรรทัดความคิดใหม่ ในตอนท้ายของแต่ละเซสชันก่อนที่จะปิดไฟล์ด้วยCtrl+ Dฉันมักจะเพิ่มบรรทัดว่าง (5-10) บรรทัด (ปุ่มย้อนกลับ) จำนวนมากเพื่อแยกเซสชัน เห็นได้ชัดว่านี่ไม่ฉลาดมาก แต่ใช้งานได้สำหรับฉันเพื่อจุดประสงค์นี้ ฉันไม่แต่สิ้นสุดขึ้นกับจำนวนมากและจำนวนบรรทัดที่ว่างเปล่าที่ไม่จำเป็นดังนั้นฉันกำลังมองหาวิธีที่จะลบ (ส่วนใหญ่) สายพิเศษ มีคำสั่ง Linux (ตัด, วาง, grep, ... ?) ที่สามารถใช้โดยตรงกับตัวเลือกไม่กี่? อีกวิธีหนึ่งไม่มีใครมีความคิดสำหรับ sed, awk หรือ perl (ดีในภาษาสคริปต์ใด ๆ จริง ๆ แม้ว่าฉันจะชอบ sed หรือ awk) สคริปต์ที่จะทำสิ่งที่ฉันต้องการ? เขียนอะไรบางอย่างใน C ++ (ซึ่งจริง ๆ …
14 scripting  sed  awk  perl  filter 

2
แทนที่พื้นที่ว่างค่าที่หายไปด้วยศูนย์
ฉันมีไฟล์ข้อความที่คั่นด้วยแท็บ input.txt ประมาณ 30K บรรทัดฉันต้องการตรวจสอบแต่ละแถว (s1..s30K บรรทัด) สำหรับค่าที่หายไป (เช่นพื้นที่ว่าง) และเติมค่าที่หายไปด้วยค่าศูนย์ดู out.txt input.txt id no1 no2 no3 no4 s1 23 34 45 12 s2 4 4 s3 4 8 0 out.txt id no1 no2 no3 no4 s1 23 34 45 12 s2 0 4 4 0 s3 4 0 8 0

2
การใช้บรรทัดว่างเป็นบริบท“ group-separator” สำหรับ grep
ฉันต้องการเอาต์พุต grep ที่มีบริบทสีและบรรทัดว่างเป็นตัวคั่นกลุ่ม ในคำถามนี้ฉันเรียนรู้วิธีการกำหนดแบบกำหนดเองgroup-separatorและฉันได้สร้างคำสั่ง grep ของฉันเช่นนี้: grep --group-separator="" --color=always -A5 แต่ตัวแยกกลุ่มไม่ได้ว่างเปล่า แต่ก็ยังมีรหัสสี (เช่น[[36m[[K[[m[[K) --color=alwaysนี้เป็นเพราะฉันใช้ แต่ฉันต้องการสีในคำสั่ง grep ของฉันและฉันต้องการตัวคั่นเป็นบรรทัดว่าง (สำหรับการประมวลผลเพิ่มเติม) ฉันจะรวมสองเงื่อนไขนี้ได้อย่างไร
12 grep  perl  colors 

3
มีวิธีที่จะทำให้ Perl - ฉันไม่ได้เชื่อมโยงการอุดตัน?
เพื่อนของฉันชี้ให้เห็นว่าถ้าคุณ: perl -pi.bak -e 's/foo/bar/' somefile เมื่อ "somefile" เป็น symlink จริง Perl จะทำตามที่เอกสารบอกว่าจะทำ: ทำได้โดยเปลี่ยนชื่อไฟล์อินพุตเปิดไฟล์เอาต์พุตโดยใช้ชื่อดั้งเดิมและเลือกไฟล์เอาต์พุตนั้นเป็นค่าเริ่มต้นสำหรับคำสั่ง print () ส่วนขยายหากให้มาจะใช้ในการแก้ไขชื่อของไฟล์เก่าเพื่อทำสำเนาสำรอง [... ] ซึ่งส่งผลให้ symlink ใหม่ "somefile.bak" ชี้ไปที่ไฟล์จริงที่ไม่เปลี่ยนแปลงและไฟล์ใหม่ "somefile" ที่มีการเปลี่ยนแปลงปกติพร้อมการเปลี่ยนแปลง ในหลายกรณีการติดตาม symlink จะเป็นพฤติกรรมที่ต้องการ (แม้ว่าจะออกจากตำแหน่งที่ถูกต้องของไฟล์. bak ที่ไม่ชัดเจน) มีวิธีง่ายๆในการทำเช่นนี้นอกเหนือจากการทดสอบ symlink ใน wrapper และการจัดการกรณีอย่างเหมาะสมหรือไม่? ( sedทำสิ่งเดียวกันเพื่อสิ่งที่คุ้มค่า)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.