我想通过从数组A获取第一个元素,从数组B中获取第一个元素,将两个相等长度的数组合并为一个数组; 来自A的第二个元素,来自B的第二个元素等.以下程序说明了算法:
# file zipper.pl
use strict;
use warnings;
use 5.010;
my @keys = qw/abel baker charlie dog easy fox/;
my @values = qw/a b c d e f/;
# ==> Is there a builtin function that is equivalent of zipper()? <==
#
my %hash = zipper( \@keys, \@values );
while ( my ( $k, $v ) = each %hash ) {
say "$k=$v";
}
# zipper(): Take two equal-length arrays and merge them (one from A, one from B, …Run Code Online (Sandbox Code Playgroud) 我想实现具有以下特征的C++日志记录:
事情我并不需要的是:
cout样式表达式(例如"foo=" << foo).我只会通过一个std::string.我找到了这个答案,这似乎是为了满足我的需求,但这有点过头了.我认为我的困惑集中在仿函数上.(我读过维基百科的文章,但显然没有沉入其中.)
下面是我的部分就明白了:
#ifdef NDEBUG以保持被编译的记录通话(但我需要能够在运行时设置日志记录).__FILE__和__LINE__在点记录器被调用.static_cast<std::ostringstream&>.开头的表达式.我认为这纯粹与评估cout样式格式字符串有关,我不打算支持它.这是我在努力的地方:
Logger& Debug() {
static Logger logger(Level::Debug, Console);
return logger;
}
Run Code Online (Sandbox Code Playgroud)
阅读operator(),它看起来像class Logger用于创建"仿函数".每个Logger仿函数都使用级别和LogSink进行实例化(?).(你是否"实例化"一个仿函数?)LogSink被描述为"后端消费预先格式化的消息",但我不知道它会是什么样子或它是如何"写入"的.在什么时候实例化静态Logger对象?是什么导致它被实例化?
这些宏定义......
#define LOG(Logger_, Message_) \
Logger_( \
static_cast<std::ostringstream&>( \
std::ostringstream().flush() << Message_ \
).str(), \
__FUNCTION__, \
__FILE__, \
__LINE__ \
); …Run Code Online (Sandbox Code Playgroud) 林肯的网络编程林肯斯坦是一本出色的书籍,但最新版本(实际上是唯一的版本)是版权2001,与Perl 5.6同时代表.
我特别感兴趣的是使用IO :: Socket并创建健壮的fork(有时是exec)ing服务器.我正在使用Perl 5.14.
知道这本书的人,或者有Perl历史知识的人,是否知道Perl或CPAN在那之后发生了哪些进展可能使本书中的某些主题过时或不太理想?
我希望有一个Perl守护进程监听并接受来自客户端的传入连接,然后fork&exec另一个Perl程序继续与客户端进行对话.
简单地分叉时我可以做到这一点 - 守护进程代码也包含子代码.但是我没有看到open socket如何通过exec()传递给另一个Perl程序.
不知怎的,我得到的印象是这在Unix(这是我的环境)中很容易,因此在Perl中也是如此.真的可以吗?
我需要一个"字符串池"对象,我可以在其中重复插入"字符序列"(我使用这个短语来表示"字符串"而不会将其与std :: string或C字符串混淆),获取指向序列的指针,如果/当池需要增长时,保证指针不会失效.使用简单std::string的池作为池将无法工作,因为当字符串超出其初始容量时可能会重新分配字符串,从而使所有先前指针无效.
游泳池不会无限制地增长 - 我会在其上调用一个clear()方法明确定义点- 但我也不想保留任何最大容量.它应该能够在不移动的情况下成长.
我正在考虑的一种可能性是将每个新的字符序列插入到a中forward_list<string>并获得begin()->c_str().另一个是插入unordered_set<string>,但我很难找到当unordered_set必须增长时会发生什么.我正在考虑的第三种可能性(不太热情)是滚动我自己的1K缓冲区链,我将其连接到字符序列中.这具有(我猜)具有最高性能的优势,这是该项目的要求.
我有兴趣听听其他人如何建议接近这个.
更新1:编辑以澄清我对短语"chars序列"的使用等同于"字符串"的一般概念,而不暗示std :: string或以null结尾的char数组.
编译一个C++程序使用gcc -pg -g(至少,这些是我在Makefile中给出的参数;没有任何确凿的证据证明执行了什么命令).程序运行到正常完成,CWD设置为我的主目录.没有写gmon.out文件.
gcc是4.4.7.OS是centos 6.
我的程序是由一个手动滚动的Perl守护进程使用fork/exec启动的.我已经验证了CWD是我的主目录,并且它是可写的,通过在执行touch foo我的目标程序之前执行守护进程.至于我已经能够研究,这不应该影响程序的分析或写gmon.out终止(通常).
\x20 下的大多数 ASCII 代码似乎已完全过时。今天它们还被使用吗?它们是否可以被视为“可供争夺”,还是最好避免它们?
我需要一个分隔符来将“行”分组在一起,为此目的选择其中一个分隔符肯定会很好。
从man ascii:
Oct Dec Hex Char
----------------------------------------------
000 0 00 NUL '\0'
001 1 01 SOH (start of heading)
002 2 02 STX (start of text)
003 3 03 ETX (end of text)
004 4 04 EOT (end of transmission)
005 5 05 ENQ (enquiry)
006 6 06 ACK (acknowledge)
007 7 07 BEL '\a' (bell)
010 8 08 BS '\b' (backspace)
011 9 09 HT '\t' (horizontal tab)
012 10 0A LF …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Java中创建一个优先级阻塞队列,该队列维护具有相同优先级的元素的FIFO顺序.Oracle文档提供了一些帮助,但我仍然非常纠结.
我应该注意以下主题对我来说都是非常新的:泛型,作为类型的接口和静态嵌套类.所有这些都在以下类定义中发挥作用.特别是泛型,令人困惑,我确信我已经完全搞砸了他们.
我已经包含了注释,以确定我目前正在获得的编译器错误.
几个具体问题:
是否可以让类表示排队的事件对象,实际的队列是静态类成员?
将Oracle的FIFO事件"包装器"作为静态嵌套类包含在内是否合理?
我在这里至少走在正确的轨道上,在一个外层阶段做到这一切吗?
这是我写的课程:
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.atomic.AtomicLong;
public class FIFOPBQEvent {
/**
* First we define a static nested class which, when instantiated,
* encapsulates the "guts" of the event - a FIFOPBQEvent - along with
* a sequence number that assures FIFO behavior of events of like priority.
*
* The following is lifted ALMOST verbatim (I added "static" and some
* comments) from …Run Code Online (Sandbox Code Playgroud) 我正在使用这个练习作为教学工具来帮助我学习一些Java GUI编程概念.我正在寻找的是一般性的理解,而不是一个特定问题的详细解决方案.我希望编码这个"正确"将教会我如何处理未来的多线程问题.如果这对于这个论坛来说太笼统了,那么它可能属于程序员吗?
我正在模拟读卡器.它有一个GUI,允许我们将卡加载到料斗中并按下Start等,但它的主要"客户端"是CPU,在单独的线程上运行并请求卡.
读卡器保持单个缓冲区.如果卡片请求进入且缓冲区为空,读卡器必须从料斗读取卡片(需要1/4秒,这是1962年).在将卡读入缓冲区后,读卡器将缓冲区发送到CPU,并在下一个请求之前立即启动另一个缓冲区加载操作.
如果不仅缓冲器是空的,而且料斗中没有卡,那么我们必须等到操作员将料斗放入料斗并按下Start(它始终启动缓冲加载操作).
在我的实现中,卡请求以invokeLater() Runnables在EDT上排队的形式发送到读卡器.在myRunnable.run()时间,无论是一个缓冲器将可用(在这种情况下,我们可以将其发送到CPU和开球另一个缓冲器负载操作),或缓冲区将是空的.如果它是空的怎么办?
两种可能性:(a)飞行中已经有缓冲加载操作,或(b)卡漏斗是空的(或尚未启动).在任何一种情况下,让EDT等待是不可接受的.工作(和等待)必须在后台线程上完成.
为了简单起见,我尝试生成一个SwingWorker来响应每个卡请求,而不管缓冲区的状态如何.伪代码是:
SwingWorker worker = new SwingWorker<Void, Void>() {
public Void doInBackground() throws Exception {
if (buffer.isEmpty()) {
/*
* fill() takes 1/4 second (simulated by Thread.sleep)
* or possibly minutes if we need to have another
* card deck mounted by operator.
*/
buffer.fill();
}
Card card = buffer.get(); // empties buffer
/*
* Send card to CPU
*/
CPU.sendMessage(card); // <== (A) put card in msg queue …Run Code Online (Sandbox Code Playgroud) 我正在使用g ++ 4.4.7进行编译(当前不能更高),并使用-std=gnu++0x编译器开关,它应该允许第三行的语法.
typedef std::vector<CI_RecordInfo_Pair> CI_RecordInfo_Vector;
typedef std::vector<std::pair<std::string, CI_RecordInfo_Vector*> > MgrBlks;
MgrBlks mgr_n_blks { {"T2M_NAME", NULL} }; // <--- line 59
Run Code Online (Sandbox Code Playgroud)
但是,编译器抱怨如下:
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h: In constructor 'std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[9], _U2 = long int, _T1 = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = CI_RecordInfo_Vector*]':
tom.cpp:59: instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h:90: error: invalid conversion from 'long int' to 'CI_RecordInfo_Vector*'
Run Code Online (Sandbox Code Playgroud)
我假设"long int"是NULL,并且由于某种原因我无法将其转换为指针.然而在结构图的其他地方,我能够编译类似的东西
foo["X"] = { NULL, "bar", 12 }; // first element is a pointer
Run Code Online (Sandbox Code Playgroud)
有什么不同?