我正在尝试在PHP CLI脚本中调用长时间运行的shell命令exec().但我不能为我的生活弄清楚如何中断PHP脚本并杀死衍生的子进程.好像我打电话exec(),我的信号处理程序被忽略了.以下代码正如我所期望的那样工作; 如果我将SIGTERM发送到进程,它会SIGTERM立即回复并退出.
<?php
declare(ticks = 1);
function sig_handler($signo) {
switch ($signo) {
case SIGTERM:
echo 'SIGTERM' . PHP_EOL;
flush();
break;
default:
}
}
pcntl_signal(SIGTERM, 'sig_handler', false);
sleep(60);
?>
Run Code Online (Sandbox Code Playgroud)
但是,如果我替换sleep(60);为exec('sleep 60');,在睡眠结束之前我不会到达我的信号处理程序.我有两个问题:
exec(或shell_exec或proc_open)?exec?我想使用DBI将值插入两个单独的MySQL表中.我试图INSERT通过;在它们之间插入一个将两个工作查询合并为一个:
$dbh->do(q{
INSERT INTO `testA`(test) values('testvalue111');
INSERT INTO `testB`(test) values('testvalue222');
});
Run Code Online (Sandbox Code Playgroud)
但我总是得到一个错误:
"INSERT INTO`testB`(测试)值('testvalue222 ......)中的语法错误
如果我将查询分成两个单独的do调用,它就可以工作.但组合查询在phpMyAdmin中工作正常.为什么它在Perl中失败?
我正在尝试运行以下代码:
foreach my $k (keys %rec) {
#switch for watchlist figures
given ($k) { #line 93
# Code omitted
when ("p") { #positive breakout
if ($row{cls} > $rec{$k}) {
$email .= "positive";
} # line 104
}
when ("n") { #negative breakout
if ($row{cls} < $rec{$k}) { #line 107
Run Code Online (Sandbox Code Playgroud)
但我得到一个语法错误:
syntax error at check_watch.pl line 93, near ") {"
syntax error at check_watch.pl line 104, near "}"
Unterminated <> operator at check_watch.pl line 107.
Run Code Online (Sandbox Code Playgroud)
为什么?
我写了一个简单的脚本使用given/ when来试用这个功能,但我不断收到编译错误.最后,我use 5.010_001;在脚本的顶部包含了一些内容,认为我的Perl版本太旧了,无法使用given/ when.有效.
然后我打印了我的Perl版本$]并使用它:use 5.018_002;它也起作用了.为什么Perl默认不使用最新安装版本的功能?
我需要在我的程序之一中以以下格式显示日期:
day - month - year "HH:MM:SS". <microseconds>
Run Code Online (Sandbox Code Playgroud)
我正在使用 Perl 5.8,我尝试使用纪元秒并将时间转换为微秒,如下所示:
my $epoch = time();
my $time1 = ($epoch - int($epoch)) *1e6
Run Code Online (Sandbox Code Playgroud)
但我得到这个输出:
25-05-2016 18:20:20.<incorrect number>
Run Code Online (Sandbox Code Playgroud) 我正在打包一个数字数组,通过UDP使用套接字编程发送到另一个硬件.
当我pack的数字12.2然后unpack它,我得到12.199999892651.当我处理与纬度和经度相关的数字时,我不能有这样的偏差.
这是我写的简单脚本:
use warnings;
use Time::HiRes qw (sleep);
@Data = ( 20.2, 30.23, 40.121, 1, 2, 3, 4, 6. 4, 3.2, 9.9, 0.1, 12.2, 0.99, 7.8, 999, 12.3 );
$myArr = pack('f*', @Data);
print "$myArr\n\n";
@Dec = unpack('f*',$myArr);
print "@Dec";
Run Code Online (Sandbox Code Playgroud)
输出是:
20.2000007629395 30.2299995422363 40.1209983825684 1 2 3 4 6.40000009536743 3.20 000004768372 9.89999961853027 0.100000001490116 12.1999998092651 0.9900000095367 43 7.80000019073486 999 12.3000001907349
Run Code Online (Sandbox Code Playgroud)
有什么方法可以控制精度吗?
(如果这是重复的道歉,但谷歌/搜索是不可能的$+!)
我正在寻找最接近/最好的Perl's $+aka $LAST_PAREN_MATCH.
对于那些不了解Perl的人来说,它的描述如下:
$LAST_PAREN_MATCH
$+ The text matched by the last bracket of the last successful search
pattern. This is useful if you don't know which one of a set of
alternative patterns matched.
Run Code Online (Sandbox Code Playgroud)
也就是说,如果我有这样的图案(b)|(a)|(r),然后$+将包含任一b,a或r取决于哪个子模式匹配.
我拥有的最好的是
next((g for g in reversed(match.groups(None)) if g is not None),None)[0]
Run Code Online (Sandbox Code Playgroud)
对于长期的Perl黑客而言,这似乎是一个简单的代码.(不是说我不知道我可以将它包装在一个函数中last_paren_match(match):-)
我正在使用react-speech-recognition在我的 React 应用程序中将语音转录为文本。react-speech-recognition 提供了SpeechRecognition高阶组件,它注入了额外的属性,比如browserSupportsSpeechRecognition被封装的组件。
我的 App 组件如下所示:
// src/App.js
import React, { useEffect } from 'react';
import SpeechRecognition from 'react-speech-recognition';
const App = ({ transcript, browserSupportsSpeechRecognition }) => {
useEffect(() => {
console.log(`transcript changed: ${transcript}`);
}, [transcript]);
if (! browserSupportsSpeechRecognition) {
return <span className="error">Speech recognition not supported</span>;
}
return <span className="transcript">{transcript}</span>;
};
const options = {
autoStart: false,
continuous: false
};
export default SpeechRecognition(options)(App);
Run Code Online (Sandbox Code Playgroud)
我编写了一些测试来模拟支持语音识别的浏览器和不支持语音识别的浏览器:
// src/App.spec.js
import React from 'react';
import Enzyme, { …Run Code Online (Sandbox Code Playgroud) 我在Perl中使用Chart :: Gnuplot创建一个图形.当我在绘图区域的最边缘有数据点时,很难看到黑色绘图边框:

(你能看到(0,3)和(0,4)边缘的绘图点吗?)
有没有办法用空格填充绘图区域,以便图形边缘的绘图点偏离绘图边界?
而不是这个:
----------
| + +
+ |
| + |
----------
Run Code Online (Sandbox Code Playgroud)
...我希望它看起来更像这样:
--------------
| + + |
| + |
| + |
--------------
Run Code Online (Sandbox Code Playgroud) 我在Red Hat Linux中运行以下命令:
perl -ne '
print "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
while(/(<PRINTKIT FORM_ID=\"PP_WELCOMEKIT\">.*?<\/PRINTKIT>)/g){
print "<sf><XDF>$1</XDF></sf>"
};
' $1 > $2.$TS2.postscrub
Run Code Online (Sandbox Code Playgroud)
$2是一个文件名,$TS2只是一个日期.
目前它打印出100行
<?xml version=\"1.0\" encoding=\"utf-8\"?>
Run Code Online (Sandbox Code Playgroud)
当我真的不想让它打印任何一个.
有人可以更改上面的代码来做它正在做的一切,除了不再打印<?xml version=\"1.0\" encoding=\"utf-8\"?>了吗?我已经尝试过删除带有该行的print语句,如下所示:
perl -ne '
while(/(<PRINTKIT FORM_ID=\"PP_WELCOMEKIT\">.*?<\/PRINTKIT>)/g){
print "<sf><XDF>$1</XDF></sf>"
};
' $1 > $2.$TS2.postscrub
Run Code Online (Sandbox Code Playgroud)
这样做会使它输出一个0字节的文件,所以我知道它不起作用.