সংক্ষিপ্ত এবং পাঠযোগ্য :
perl -pe "system 'sleep .003'" log.txt
আমি এই সমাধানগুলি পোস্ট করি কারণ সেগুলি ছোট এবং পাঠযোগ্য, কারণ ডিএমএসের উত্তরের মন্তব্যগুলি মনে হয় যে এই ধরণের সমাধান প্রচার করে!
কিন্তু আমি ঘ্রিনা করি এই কারণে: এই চালানোর জন্য, পার্ল হবে মাল থেকে /bin/sleep
300x / সেকেন্ড!
এটি একটি বড় রিসোর্স ভোক্তা! এছাড়াও একটি ভুল ভাল সমাধান !!
পার্ল মধ্যে বিল্টিন ঘুম ব্যবহার
দুর্ভাগ্যক্রমে, বিল্টিন sleep
পূর্ণসংখ্যার মধ্যে সীমাবদ্ধ। সুতরাং আমাদের select
পরিবর্তে ব্যবহার করতে হবে:
perl -e 'print && select undef,undef,undef,.00333 while <>;'
পার্লের অধীনে, স্যুইচ print while <>
দ্বারা প্রতিস্থাপন করা যেতে পারে -p
:
perl -pe 'select undef,undef,undef,.00333'
আসুন চেষ্টা করুন:
time /bin/ls -l /usr/bin | perl -pe 'select undef,undef,undef,.00333' | wc
2667 24902 171131
real 0m9.173s
user 0m0.056s
sys 0m0.048s
bc -l < <(echo 2667/9.173)
290.74457647443584432573
ব্যাখ্যা:
300 লাইন / সেকেন্ড মানে 1 লাইন দ্বারা 0.0033333333 সেকেন্ড।
print
ডিফল্ট ইনপুট স্পেস$_
যা আর্গুমেন্ট প্রিন্ট ছাড়াই ।
হিসাবে ডাকা হয় ... | perl -e
, ... | perl -ne
বা ... | perl -pe
, স্ট্যান্ডার্ড ইনপুট অটোমেটিক্যালি নির্ধারিত হবে *STDIN
যা ডিফল্ট ফাইল বর্ণনাকারী , তাই <>
একই কাজ <STDIN>
করবে যা স্ট্যান্ডার্ড ইনপুট থেকে পড়বে যতক্ষণ না $/
( ইনপুট রেকর্ড বিভাজক যা ডিফল্টরূপে একটি নতুন লাইন থাকে ) পৌঁছায়। ইংরাজীতে, ডিফল্টরূপে স্ট্যান্ডার্ড ইনপুট থেকে একটি লাইন <>
পড়বে এবং সামগ্রীটিকে ভেরিয়েবলের জন্য বরাদ্দ করবে ।$_
&&
এটি একটি শর্ত এবং শর্ত, তবে সেখানে চেইন কমান্ড বিভাজক হিসাবে ব্যবহৃত হয় সুতরাং (সাফল্যের সাথে) পরের কমান্ডটি করে একটি লাইন প্রিন্ট করার পরে।
select
ব্যবহার না করার জন্যsleep
এটি একটি প্রোগ্রামারের কৌশল । এই কমান্ডটি ফাইল বর্ণনাকারীদের (ইনপুট এবং / অথবা আউটপুট, ফাইল, সকেট এবং / অথবা নেট সকেট) ইভেন্টগুলি ফাঁদে নকশা করা হয়েছে । এই কমান্ড দিয়ে, একটি প্রোগ্রাম পারে অপেক্ষা ঘটনা 3 ধরনের জন্য, পড়া করার জন্য প্রস্তুত ভোজন , লিখতে প্রস্তুত ভোজন এবং কিছু ঘটনা ফিডে ঘটেছে । চতুর্থ আর্গুমেন্টটি সেকেন্ডে একটি সময়সীমা হয়, তাই বাক্য গঠন হয় select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>
।
আরও নির্ভুলতার জন্য, আপনি Time::Hires
পার্ল মডিউলটি ব্যবহার করতে পারেন :
perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'
নোট: $.
হয় বর্তমান ইনপুট লাইন সংখ্যা ।
ভাল হিসাবে লিখিত cat >catLps.pl
#!/usr/bin/perl -w
use strict;
use Time::HiRes qw|time|;
my $start=time;
my $lps=300;
$lps=shift @ARGV if @ARGV && $ARGV[0]=~/^(\d+)$/;
my $sleepPerLine=1/$lps;
print &&
select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)
while <>
ব্যবহার:
catLps.pl [lps] [file] [file]...
প্রথম যুক্তি lps
হ'ল secondsচ্ছিক লাইন প্রতি সেকেন্ডে সাংখ্যিক যুক্তি (ডিফল্ট: 300)
দ্রষ্টব্য: যদি ফাইলের নাম শুধুমাত্র সাংখ্যিক হয়, তাহলে আপনি তাদের পাথ দিয়ে নির্দিষ্ট করুন করতে হতে পারে: ./3
।
ভালো লেগেছে cat
এই যুক্তি এবং / অথবা হিসেবে দেওয়া ফাইল পাস পারে স্ট্যান্ডার্ড ইনপুট
সুতরাং আমরা পারে:
TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040
time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042
মজার জন্য:
export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))
cat FILENAME | pv -l -L 900 -q
। সীমাটি প্রতি সেকেন্ডে বাইটে হয়, প্রতি সেকেন্ডে লাইন নয়, তাই আমি এই মন্তব্যটি একটি উত্তর নয়।