我正在使用perl正则表达式匹配我所拥有的网络脚本的问题,我已经设法将行为放在一个小片段中.
在Debian中将这个Perl片段用于Perl 5.10.0:
#!/usr/bin/perl
use warnings;
use strict;
my $line = "Version: 0\r\n";
my($version) = $line =~ m/^Version:(\s\d+)\r\n$/;
print "1st failed \n" if not $version;
($version) = $line =~ m/^Version:\s(\d+)\r\n$/;
print "2nd failed \n" if not $version;
($version) = $line =~ m/^Version:\ (\d+)\r\n$/;
print "3th failed \n" if not $version;
Run Code Online (Sandbox Code Playgroud)
有了这个输出:
2nd failed
3th failed
Run Code Online (Sandbox Code Playgroud)
显然,第一和第二之间的唯一区别是将空间移出提取的模式,理论上不应该修改正则表达式,只返回返回的部分.
我不明白为什么第二和第三不完全像第一个一样.
编辑:如果你删除$ version中的括号不是相同的脚本,你得不到匹配的结果,你得到op的布尔结果,以获得你需要在一元中接收它的匹配结果(只有一个)字符串匹配)元组.
我正在实现一个基于 std::queue 的 C++ 消息队列。
由于我需要 popers 等待空队列,因此我正在考虑使用 mutex 进行互斥,并使用 cond 来挂起空队列上的线程,就像 glib 对 gasyncqueue 所做的那样。
然而,在我看来,互斥体和信号量可以完成这项工作,我认为它包含一个整数,并且对于待处理的消息来说,这似乎是一个相当高的数字。
信号量的优点是,您不需要每次从等待返回时手动检查条件,因为您现在可以确定有人插入了某些内容(当有人插入了 2 个项目并且您是第二个到达的线程时)。
你会选哪一个?
编辑:更改了响应@Greg Rogers 的问题
我将auto_ptr初始化为NULL,稍后在游戏中我需要知道它是否为NULL以返回它或新副本.
我试过这个
auto_ptr<RequestContext> ret = (mReqContext.get() != 0) ? mReqContext : new RequestContext();
Run Code Online (Sandbox Code Playgroud)
和其他几个类似的东西一样,但是g ++试图调用auto_ptrs不存在的运算符?(三元运算符)而不是使用RequestContext*进行三元比较.
即使我施展它也行不通.
任何提示?
编辑等于不平等
我正在寻找一种从这组信息中获取密钥的方法,我知道我们正在使用带有CBC的16字节块,并且我有第一个16字节明文和加密,以及使用过的IV.
目前我可以通过比较输出来测试一个键是否正确,但是出于显而易见的原因我不能强行使用16个字符键,阅读其他帖子我的理解是拥有我拥有的数据可能是获得密钥的.
任何提示?
epoll联机帮助页说,如果没有读取,则EPOLLET注册的fd(边缘触发)不应通知两次EPOLLIN.
所以在EPOLLIN之后你需要清空缓冲区,然后epoll_wait才能在新数据上返回一个新的EPOLLIN.
但是我遇到了这种方法的问题,因为我看到了未触及的fds的重复EPOLLIN事件.
这是strace输出,0x200是EPOLLRDHUP,在我的glibc头文件中尚未定义,但在内核中定义.
30285 epoll_ctl(3, EPOLL_CTL_ADD, 9, {EPOLLIN|EPOLLPRI|EPOLLERR|EPOLLHUP|EPOLLET|0x2000, {u32=9, u64=9}}) = 0
30285 epoll_wait(3, {{EPOLLIN, {u32=9, u64=9}}}, 10, -1) = 1
30285 epoll_wait(3, {{EPOLLIN, {u32=9, u64=9}}}, 10, -1) = 1
30285 epoll_wait(3, <unfinished ...>
30349 epoll_ctl(3, EPOLL_CTL_DEL, 9, NULL) = 0
30306 recv(9, "7u\0\0\10\345\241\312\t\20\f\32\r\10\27\20\2\30\200\10 \31(C0\17\32\r\10\27\20\2\30"..., 20000, 0) = 20000
30349 epoll_ctl(3, EPOLL_CTL_DEL, 9, NULL) = -1 ENOENT (No such file or directory)
30305 recv(9, " \31(C0\17\32\r\10\27\20\2\30\200\10 \31(C0\17\32\r\10\27\20\2\30\200\10 \31("..., 20000, 0) = 10011
Run Code Online (Sandbox Code Playgroud)
因此,在添加fd编号9之后,我在收到文件描述符之前会收到2个连续的EPOLLIN事件,系统调用跟踪显示我在读取之前如何删除fd,但它应该只发生一次,每个事件一个.
所以要么我没有正确阅读该联机帮助页,要么现在正在这里工作.
我正在编写一个erlang模块,它必须处理一些字符串,而不是太多,但是,我做了一些tcp recv,然后对数据进行了一些解析.
在匹配数据和操作字符串时,我一直在使用二进制模块,binary:split(Data,<<":">>)并且基本上一直使用<<"StringLiteral">>它.
直到现在我没有遇到困难或缺少替代方法(使用列表),一切都很自然地出来,除了可能添加<< >>,但我想知道这种处理字符串的方式是否有缺点我是不知道.
任何提示?
我有这个与我合作的gen_server:
-module(user_info_provider).
-export([start_link/0, stop/0]).
-export([init/1, terminate/2, handle_info/2, handle_call/3, handle_cast/2,
code_change/3]).
-export([request_user_info/2]).
-behaviour(gen_server).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
stop() ->
gen_server:cast(?MODULE, stop).
request_user_info(From,UserId) ->
gen_server:cast(?MODULE, {request_user_info, From, UserId}).
%% Callback Functions
init(_) ->
process_flag(trap_exit, true),
io:format("I am ~w ~n", [self()]),
{ok, null}.
%% @doc terminate
terminate(Reason, _LoopData) ->
io:format("Terminating by ~w~n",[Reason]),
{ok, null}.
handle_cast({request_user_info,From,UserId}, LoopData) ->
{noreply, LoopData};
handle_cast(stop, LoopData) ->
{stop, normal, LoopData}.
handle_info(_Info, State) ->
{ok, State}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
handle_call(_,_From,LoopData) ->
{ok,ok,LoopData}.
Run Code Online (Sandbox Code Playgroud)
问题是,正如我接下来所展示的那样,如果我从cli中执行它就像 …
我有一个包含以下内容的结构:
struct mystruct{
int id[10];
char text[40];
unsigned short int len;
};
Run Code Online (Sandbox Code Playgroud)
而我正试图将它解压缩到一行,如下所示:
my(@ids,$text,$length) = unpack("N10C40n",$buff) ;
Run Code Online (Sandbox Code Playgroud)
但是一切都是第一个数组(@ids),我已经尝试了模板" N10 C40 n"和" (N10)(C40)(n)"所以,要么这不能完成,要么我没有使用正确的模板字符串.
注意:我正在使用大端数据.
任何提示?
我有一个目前订阅的非阻塞套接字:
ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLRDHUP| EPOLLET;
Run Code Online (Sandbox Code Playgroud)
它收到一些EPOLLIN,我读到非阻塞直到EAGAIN,然后我收到HUP和RDHUP,有时候还有几个字节要读.
另一方面是:
send(socket,960_bytes_buffer)
close(socket);
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用msg_peek直接在epollin和关闭时间的事件循环中进行recv,并且添加接收数据它总是不会收到960,有时只有大约480字节.
在发送和关闭之间使套接字无阻塞或在客户端中进入休眠(1)工作正常.
它看起来更像是一个非阻塞套接字的问题而不是与epoll相关的问题.简单的"nc -l -p port"接收适当的字节数.
我正在研究一种声音转换算法,其中接收一组带符号的短路.
在算法的给定点,它将样本从16位转换为14位,并且它像这样:
int16_t sample = (old_sample + 2) >> 2;
Run Code Online (Sandbox Code Playgroud)
对我来说很清楚,因为我们想要摆脱至少2个重要位,所以需要移位,但+2那里呢?
linux ×5
c++ ×2
epoll ×2
erlang ×2
perl ×2
aes ×1
audio ×1
auto-ptr ×1
binary ×1
c ×1
cryptography ×1
encryption ×1
epollet ×1
gen-server ×1
networking ×1
nonblocking ×1
pcm ×1
posix ×1
regex ×1
sockets ×1
stl ×1
string ×1
unpack ×1