小编Cha*_*hap的帖子

Perl - 内置函数将两个数组"拉链"在一起?

我想通过从数组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)

arrays perl merge

18
推荐指数
3
解决办法
4022
查看次数

使用全局变量和仿函数实现日志记录

我想实现具有以下特征的C++日志记录:

  • 它必须对所有源代码都可用,而不需要每个函数都有一个额外的参数(我认为它需要一个全局参数)
  • 日志记录调用可以指定严重性级别(INFO,DEBUG,WARN等),并且可以在运行时设置日志记录工具以忽略低于特定严重性级别的调用
  • 可以在运行时将日志接收器设置为控制台或文件.

事情我并不需要的是:

  • 在运行时支持多个日志接收器(即,它都可以转到控制台或文件)
  • 支持多线程日志记录
  • 能够在记录器调用中传递cout样式表达式(例如"foo=" << foo).我只会通过一个std::string.

我找到了这个答案,这似乎是为了满足我的需求,但这有点过头了.我认为我的困惑集中在仿函数上.(我读过维基百科的文章,但显然没有沉入其中.)

下面是我的部分明白了:

  • 使用宏(例如LOG_DEBUG)方便地指定严重性级别并调用记录器.
  • 使用#ifdef NDEBUG以保持被编译的记录通话(但我需要能够在运行时设置日志记录).
  • 使用宏来调用记录器,以便它可以自动和无形地增加信息像的基本原理__FILE____LINE__在点记录器被调用.
  • LOG宏包含一个以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)

c++ logging global-variables functor

14
推荐指数
1
解决办法
358
查看次数

使用Perl的网络编程,由Stein - 仍然相关?

林肯的网络编程林肯斯坦是一本出色的书籍,但最新版本(实际上是唯一的版本)是版权2001,与Perl 5.6同时代表.

我特别感兴趣的是使用IO :: Socket并创建健壮的fork(有时是exec)ing服务器.我正在使用Perl 5.14.

知道这本书的人,或者有Perl历史知识的人,是否知道Perl或CPAN在那之后发生了哪些进展可能使本书中的某些主题过时或不太理想?

sockets perl networking fork

10
推荐指数
1
解决办法
977
查看次数

Perl - 在fork/exec之间传递一个打开的套接字

我希望有一个Perl守护进程监听接受来自客户端的传入连接,然后fork&exec另一个Perl程序继续与客户端进行对话.

简单地分叉时我可以做到这一点 - 守护进程代码也包含子代码.但是我没有看到open socket如何通过exec()传递给另一个Perl程序.

不知怎的,我得到的印象是这在Unix(这是我的环境)中很容易,因此在Perl中也是如此.真的可以吗?

sockets perl fork exec

9
推荐指数
1
解决办法
2102
查看次数

实现一个保证不移动的"字符串池"

我需要一个"字符串池"对象,我可以在其中重复插入"字符序列"(我使用这个短语来表示"字符串"而不会将其与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++ string c++-standard-library string-pool

9
推荐指数
1
解决办法
4540
查看次数

使用gcc -pg -g编译后不会写入gmon.out

编译一个C++程序使用gcc -pg -g(至少,这些是我在Makefile中给出的参数;没有任何确凿的证据证明执行了什么命令).程序运行到正常完成,CWD设置为我的主目录.没有写gmon.out文件.

gcc是4.4.7.OS是centos 6.

我的程序是由一个手动滚动的Perl守护进程使用fork/exec启动的.我已经验证了CWD是我的主目录,并且它是可写的,通过在执行touch foo我的目标程序之前执行守护进程.至于我已经能够研究,这不应该影响程序的分析或写gmon.out终止(通常).

c++ linux gcc gprof

8
推荐指数
2
解决办法
4276
查看次数

大多数 ASCII 控制字符是否已过时?

\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)

ascii control-characters delimiter

8
推荐指数
1
解决办法
2167
查看次数

如何创建保留FIFO行为的Java PriorityBlockingQueue?

我正在尝试在Java中创建一个优先级阻塞队列,该队列维护具有相同优先级的元素的FIFO顺序.Oracle文档提供了一些帮助,但我仍然非常纠结.

我应该注意以下主题对我来说都是非常新的:泛型,作为类型的接口静态嵌套类.所有这些都在以下类定义中发挥作用.特别是泛型,令人困惑,我确信我已经完全搞砸了他们.

我已经包含了注释,以确定我目前正在获得的编译器错误.

几个具体问题:

  1. 是否可以让类表示排队的事件对象,实际的队列是静态类成员?

  2. 将Oracle的FIFO事件"包装器"作为静态嵌套类包含在内是否合理?

  3. 我在这里至少走在正确的轨道上,在一个外层阶段做到这一切吗?

这是我写的课程:

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 priority-queue fifo

7
推荐指数
1
解决办法
5676
查看次数

如何使用SwingWorker模拟缓冲的外围设备?

我正在使用这个练习作为教学工具来帮助我学习一些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)

java concurrency swing buffering swingworker

7
推荐指数
2
解决办法
1880
查看次数

C++无法将对中的指针初始化为NULL

我正在使用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)

有什么不同?

c++ null pointers std-pair

7
推荐指数
1
解决办法
2921
查看次数