짧고 읽기 쉬운 :
perl -pe "system 'sleep .003'" log.txt
DMas의 답변에 대한 의견 이 이러한 종류의 솔루션을 홍보하는 것처럼 보이기 때문에 작고 읽을 수 있기 때문에이 솔루션을 게시합니다 !
이 실행을 위해, 펄이됩니다하지만이 때문에 싫어 포크 에 /bin/sleep
300X / 초!
이것은 큰 자원 소비자입니다! 또한 잘못된 좋은 해결책 !
Perl 에서 내장 수면 사용
불행히도 내장 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 라인 x 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 모듈을 사용할 수 있습니다 .
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
는 초당 선택적 행입니다. 숫자 인수 (기본값 : 300)
참고 : filename이 숫자 인 경우 path :로 지정해야합니다 ./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
. 제한은 초당 줄이 아니라 초당 바이트 수이므로 주석이 답이 아닙니다.