我已经"继承"了一些Tcl代码,虽然我已经完成了一些教程并且能够理解语言,但是我自己的Tcl构造缺乏一定的技巧.
例如,我有这个代码:
puts "Column 'name': [ $queryRs getString name ]"
Run Code Online (Sandbox Code Playgroud)
$queryRs是SQL查询的结果集.该[ $queryRs getString name ]构造从结果集中的当前行检索表列"name"的内容.如果数据库字段为NULL,puts则不会打印任何内容.
我想打印一个"默认"字符串,即如果[ $queryRs getString name ]没有结果,我想用它替换它"--".
现在,我可以这样做:
set nameVar "[ $queryRs getString name ]"
if { [ string length $nameVar ] == 0 } {
set nameVar "--"
}
puts "Column 'name': $nameVar"
Run Code Online (Sandbox Code Playgroud)
但必须有一个更紧凑的解决方案,可以内联完成,而不是添加四行和一个临时变量.请帮忙?
在尝试实现 freopen()时,我在标准中提出了一条规范,据我所知,该规范实际上并未指定任何内容。
因此...freopen()将关闭流(忽略错误),清除其错误和 EOF 标志,重置宽方向,然后使用给定模式重新打开流。这已经很清楚了;这基本上是一个 fclose() / fopen()。即使它不是这样定义的,但很明显这就是我们的意图。
但是,我有两个关于setvbuf()可以对流执行的操作的问题 - 设置用户分配的缓冲区和/或更改缓冲区策略。
问题1.
1)freopen()预计会将事情恢复到默认状态,就像它实际调用过一样fopen()?或者无论用户在旧流上设置了什么,它都有望延续到新流中吗setvbuf()?这指的是缓冲存储器和缓冲策略,但这里的主要问题是缓冲存储器。
规范fclose()指定用户通过的与流关联的任何缓冲区都setvbuf()被取消关联,即现在可以free()由用户设置。
但freopen()仅指定它关闭与流关联的文件,而不是它fclose()关闭它。
那么,在 后freopen(),用户关联的缓冲区内存是否仍然与流关联?
问题2。
freopen()FILE可以想象,可以在调用时实际上与打开的文件没有关联的结构上使用(因为尝试关闭文件的错误将被忽略)。
该文件结构可能是先前打开的流,具有用户分配的缓冲区内存和缓冲区策略。是freopen()遵守这些设置,即将缓冲区内存/策略与“重新”打开的文件重新关联,还是将结构重新初始化为默认值,假设用户在先前访问文件free()后删除了缓冲区内存?fclose()
我的看法是。
看看第二个问题,我没有看到标准库能够可靠地确定FILE具有用户分配的缓冲内存的当前未打开的结构是否仍然“拥有”该缓冲内存,或者用户是否已经回收了该内存。(可以想象,该内存可能是本地的,即不是由malloc()/free()即使我愿意去那里处理的内存列表的一部分 - 这将非常不寻常地涉及标准库函数所期望的工作。)
缓冲政策的类似考虑。
因此,据我所知,唯一可靠的freopen()处理方法是将“与指定流关联的任何文件”的关闭处理为“真实” fclose(),并将缓冲内存/策略重新设置为默认值。
我的理解是否正确,或者 Q1 / Q2 是否有其他答案?
c standards standard-library language-lawyer c-standard-library
首先,我不得不承认我搞砸了CVS.我有一个发布标签releaseX,这是在一段时间后完成的(即,不是HEAD).然后我决定在那时我需要一个维护分支.而不是创建一个分支标记(branchX中)除了要releaseX,我删除了释放标签并创建了一个分支标签(错误地)命名releaseX.然后我接着对维护分支上工作,创造releaseX1,releaseX2等等.
我的问题:当我退房时releaseX,我得到分支头,即该分支的最新代码.我现在需要的是分支点的代码,即前一 releaseX代码.
有没有办法做到这一点?
从备份恢复到早期存储库版本不是一种选择.
编辑:我知道我可以通过基于日期的结账来解决这个问题.我想知道是否仍然可以做一个基于标签的.
更新(Re @Philip Derbeko):我知道CVS与文件之间没有关联.但CVS 确实有分支发生的信息.在ViewVC中,我甚至可以看到它:
File X - Revision 1.y - Branch: MAIN - Branch point for: releaseX
下一个文件修订版是:
File X - Revision 1.y.2.1 - Branch: releaseX - CVS Tags: releaseX1
元数据显然存在.因此我的问题是:是否可以检查分支点,而不是分支HEAD?
我一直在使用以下方法开发多层应用程序:
安全性是架构师,开发人员还是基础架构的责任?
更具体地说,从层到层的安全性.
我想答案将是以上所有.
但是,我只是想知道人们的经历是什么 - 尤其是在非敏捷环境中工作?是否应该在技术设计文档中预先设计所有设计并确定安全性(我不知道)?
我认为我模糊地回忆起一个较新的c ++标准(可能是它的c ++ 11,或者14?〜?17 ??)允许你初始化一个结构,你可以定义一个结构然后在没有它的情况下初始化它必须编写构造函数.
例如:
struct test
{
int a;
int b;
std::string str;
};
int main()
{
std::map<int, test> test_map;
test_map[0] = test(1, 2, "test1"); // This is the line in question
// Or it might be more like: test_map[0] = test{1, 2, "test1"};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不记得这个特殊初始化的名称(或者它是否存在)!所以我的问题是:
如果这个"特征"不存在那么请把我从我的痛苦中解脱出来!可能是我的想象力已经成功了......
对于我的某个Perl项目,我需要几个Perl进程来共享一些位于C++库中的资源.(不要问,这不是这个问题的核心,只是背景.)
因此,我试图在这个上下文中钻研两个"新"字段:IPC::Shareable并使用SWIG包装C++.看来我在那里做错了,这就是我想问的问题.
在C++方面,我Rectangle用一个空构造函数,set一个size成员函数编写了一个小测试类.
然后我将该类包装在SWIG生成的Perl包中example.
在Perl方面,我试过SWIG模块按预期工作:
use example;
my $testrec = new example::Rectangle;
$testrec->set( 6, 7 );
print $testrec->size() . "\n";
Run Code Online (Sandbox Code Playgroud)
这样打印"42".
然后我试着测试我的使用方式IPC::Shareable.我编写了两个Perl脚本,一个"服务器"和一个"客户端"来测试资源共享.
服务器":
use IPC::Shareable;
use example;
# v_ for variable, g_ for (IPC) glue
my $v_array;
my $v_rect;
my %options = ( create => 'yes', exclusive => 0, mode => 0644, destroy => 'yes' );
tie $v_array, 'IPC::Shareable', 'g_array', { %options } or die;
tie $v_rect, 'IPC::Shareable', …Run Code Online (Sandbox Code Playgroud) 部分与此问题相关但不同,因为这是关于构造函数调用...
我想创建一个固定数量的对象的数组.
我能做到这一点:
my @objects;
push( @objects, new MyPackage::MyObject() );
push( @objects, new MyPackage::MyObject() );
push( @objects, new MyPackage::MyObject() );
# ...
Run Code Online (Sandbox Code Playgroud)
这是几种丑陋的.使它成为一个循环只是略微好一点.
是不是有办法在Perl中创建(构造函数初始化的)对象数组?
事后问题:
我想要创建的这些"对象"实际上是用于C结构的SWIG生成的包装器,即没有"行为"的数据结构(除了SWIG生成的get和set函数之外).我只想将数组作为参数传递给C函数,这将为我填充结构; 我是否需要调用构造函数,或者是否有一个快捷方式来get获取之后读取结构内容的函数?(是的,我对OOPerl 非常陌生......)
使用boost_filesystem时,Boost会不断为文件名添加引号.
Foo.cpp中:
#include <iostream>
#include <boost/filesystem.hpp>
int main( int argc, char * argv[] )
{
std::cout << argv[0] << std::endl;
boost::filesystem::path p( argv[0] );
std::cout << p << std::endl;
std::cout << p.filename() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译:
g++ foo.cpp -o foo -lboost_filesystem -lboost_system
Run Code Online (Sandbox Code Playgroud)
输出:
./foo
"./foo"
"foo"
Run Code Online (Sandbox Code Playgroud)
这有些出乎意料,在我的情况下不方便.这是真的故意,还是我在这方面有点老版本的Boost(1.46.1)车?有什么方法可以避免它们被添加?
我仔细阅读了文档,但除了在示例输出中没有显示引号的教程之外,我没有开悟.
我正在使用OpenSSL的高级EVP_*()功能在应用程序中实现加密/解密方案,因此我可以轻松切换使用的实际算法,而无需更改API调用。
我可以相对轻松地创建一个密钥对:
// dumbed down, no error checking for brevity
EVP_PKEY * pkey;
// can change EVP_PKEY_RSA to something else here
EVP_PKEY_CTX * context = EVP_PKEY_CTX_new_id( EVP_PKEY_RSA, NULL );
EVP_PKEY_keygen_init( ctx );
// could set parameters here
EVP_PKEY_keygen( context, &pkey );
// ...
EVP_PKEY_CTX_free( context );
Run Code Online (Sandbox Code Playgroud)
pkey现在拥有一个密钥对,即秘密密钥和公共密钥。这对于事物的秘密方面很好,但是显然我只想提取公共密钥组件以用于事物的公共方面。
我能够找到特定于RSA的功能,但使用高级EVP_*()API 却一无所获。
救命?
当您ls在命令行上没有其他选项的情况下调用时,每行会获得多个条目.
举例:
$ ls mydir/*.tar.gz
mydir/foo.tar.gz mydir/bar.tar.gz mydir/baz.tar.gz
Run Code Online (Sandbox Code Playgroud)
但是如果你想以某种方式修改输出,你每行会得到一个条目:
$ ls mydir/*.tar.gz | sed "s/\.tar\.gz//g"
mydir/foo
mydir/bar
mydir/baz
Run Code Online (Sandbox Code Playgroud)
有很多条目,这变得很麻烦 - 我希望多个对齐的列回来.
我试图想出沿着线的东西find mydir -name "*.tar.gz" -printf ...,或者... -exec ...,甚至(议员!) for file in $(find ...),但什么是我能想出的是真的很糟糕恶臭(认为计数器变量,以模和只是猜测终端宽度...) .
有一些优雅的方式来获得几个文件名的像香草多列输出ls,与他们(通过例如,具有修修补补后sed,basename等)?