小编Mor*_*nar的帖子

为什么使用自动生成文件句柄的三参数打开调用是Perl的最佳实践?

我有两个关于Perl open函数的问题:

1)我似乎记得Perl最佳实践中的3参数版本open比两个参数版本更好,例如

open(OUT, '>>', $file);
Run Code Online (Sandbox Code Playgroud)

open(OUT, ">>$file");
Run Code Online (Sandbox Code Playgroud)

这是为什么?我试图告诉别人前几天使用3参数版本,但似乎无法用任何东西支持它.

2)我似乎还记得autovivified文件句柄比bareword文件句柄更受青睐(他们称之为不同的东西)?而且也记不住为什么,例如

open(my $out, '>>', $file);
Run Code Online (Sandbox Code Playgroud)

open(OUT, '>>', $file);
Run Code Online (Sandbox Code Playgroud)

这是strict件事吗?我似乎记得能够使用OUT,strict但我不记得了.

perl file-io scope

45
推荐指数
3
解决办法
6055
查看次数

调试没有符号的核心文件

我有一个已部署到客户站点的C应用程序.它是在HP-UX上编译和运行的.用户已报告崩溃,我们已获得核心转储.到目前为止,我一直无法在内部复制崩溃.

正如您所怀疑的那样,核心文件/部署的可执行文件完全没有任何符号.当我在gdb中加载并执行bt时,我得到的最好的是:

(gdb) bt
#0  0xc0199470 in ?? ()
Run Code Online (Sandbox Code Playgroud)

我可以在文件上做一个'字符串核心',但我的理解是,所有我到达那里的是可执行文件中的所有字符串,所以在那里找到任何东西似乎是不可能的.

我确实有一个可执行文件的调试版本(用-g编译),不幸的是比发布版本新几个月.如果我尝试使用该集线器启动gdb,我会看到:

warning: exec file is newer than core file.
Core was generated by `program_name'.
Program terminated with signal 11, Segmentation fault.
__dld_list is not valid according to __dld_flags.

#0  0xc0199470 in ?? ()
(gdb) bt
#0  0xc0199470 in ?? ()
Run Code Online (Sandbox Code Playgroud)

虽然编译调试版本并将其部署在客户的站点然后等待另一次崩溃是可行的,但由于多种原因,这将是相对困难和不可取的.

我对代码非常熟悉,并且根据客户的错误报告,对代码崩溃的位置有了更好的了解.

有什么方法可以从这个核心转储中收集更多信息吗?通过字符串或其他调试器或任何东西?谢谢.

c gdb hp-ux

16
推荐指数
3
解决办法
3万
查看次数

仅在尚未运行的情况下启动Java程序

我需要在我的Java应用程序中启动1-3个外部程序,这些程序具有用户定义的路径.我的要求很少:

  1. 如果程序已经运行,我不希望程序执行

  2. 我不希望任何程序从我的Java应用程序中窃取焦点

  3. 我不在乎他们中的任何一个是否未能启动.他们只需要默默地失败.

这是我到目前为止提出的:

ProcessBuilder pb = new ProcessBuilder(userDefinedPath1);
try {
    pb.start();
}
catch (Exception e) {
    // Something went wrong, just ignore
}
Run Code Online (Sandbox Code Playgroud)

然后我用另外两条路径再重复3次.这开始就像我期望的那样,并且满足我的第三个要求就好了,但是前两个失败了.

做这个的最好方式是什么?

编辑:

  1. 我对这些其他应用程序没有任何控制权.他们是第三方.此外,用户可以随时手动启动或停止它们.

  2. 我知道可执行文件的确切名称(例如"blah.exe")并且它们将始终相同,但可执行文件的路径不一定如此.

  3. 批处理文件包装器在这里是不可行的.

  4. 其他应用程序不是 Java应用程序,只是普通的旧Windows可执行文件.

java mutual-exclusion

15
推荐指数
3
解决办法
2万
查看次数

是否可以在Visual Studio中加载不匹配的符号?

我有一个Windows minidump(C代码)和一个相应的exe文件.不幸的是,我没有完全匹配的.pdb文件,但我确实有.pdbs包含完全相同的代码,只是在不同的时间构建.在Windbg中,我可以使用:

.symopt+0x40
Run Code Online (Sandbox Code Playgroud)

告诉它加载任何东西,甚至是不匹配的符号文件.这在这个特定的实例中效果很好,我能够得到一个正确的调用堆栈.我只是好奇Visual Studio是否有这样的功能.我们在这里使用了几乎所有不同版本的VS,因此它可能属于哪个版本并不重要.谢谢.

c debugging minidump visual-studio

15
推荐指数
2
解决办法
8251
查看次数

如何保证所有单元测试在提交之前通过?

最近我们遇到了一些问题,即开发人员将代码提交给SVN但没有通过单元测试,无法在所有平台上编译,甚至无法在自己的平台上编译.虽然这一切都被我们的CI服务器(巡航控制)所取代,并且我们已经制定了试图阻止它发生的流程,但我们真的希望能够阻止流氓提交首先发生.

基于此处的一些其他问题,在服务器端强制将其作为预提交挂钩似乎是一个坏主意,主要是由于构建+运行测试所需的时间长度.我做了一些谷歌搜索并发现了这个(所有开发者都使用TortoiseSVN):

http://cf-bill.blogspot.com/2010/03/pre-commit-force-unit-tests-without.html

哪个会解决至少两个问题(它不会在Unix上构建),但如果失败则不会拒绝提交.所以我的问题:

  • 有没有办法在TortoiseSVN中进行预提交挂钩导致提交失败?
  • 有没有更好的方法来做我一般要做的事情?

svn tortoisesvn continuous-integration unit-testing

12
推荐指数
1
解决办法
7018
查看次数

在C中简单生成GUID

我觉得GUID/UUID问题在这里已经完成了死亡,但我似乎无法找到我正在寻找的东西.我需要一个能在C中生成V4 GUID的函数,即与C#中的Guid.NewGuid本质上兼容的东西.

这必须适用于Windows(XP,Server 2003/8等)和3个不同的Unix发行版(AIX,Sun和HP).

我已经看过一些规范白皮书,有些甚至有一些示例实现,但似乎总是存在适当的随机数问题,或者它们只生成V1或V3 UUID等.UUIDs的维基百科页面指出了我在几个示例库中,但这些对于我在这里要完成的工作来说太重了.

我非常强烈地感觉到我可以自己实现一些东西,但是如果有一些非常简单和轻量的东西我可以放弃,我不想浪费时间重新发明轮子.任何人都有东西或知道什么?

谢谢.

c guid

11
推荐指数
1
解决办法
1万
查看次数

为什么我们的Java应用程序不在辅助监视器上显示窗口?

我们有一个Java/Swing客户端已经存在了很多年.当我从XP迁移到Vista(客户端仅在Windows上运行)时,我注意到在我的辅助监视器上创建新窗口(通常是JFrame后代)时,窗口最初显示为空白,即不显示正常内容窗户,它只是一块坚固的灰色.如果我然后将该窗口拖动到主监视器上,第二个窗口穿过监视器边界,它会正确绘制并且我可以将其拖回辅助监视器.如果窗口是在主监视器上创建的,它总是完美地存在.我从来没有在XP上遇到过这个问题,仅限于Vista.我无法在Windows 7上轻松测试它,缺少双显示器Windows 7机器.

有人有什么想法吗?这可能是一个已知的Java bug吗?我也在运行最新的Java 1.6 SDK.

java swing windows-vista

11
推荐指数
1
解决办法
5819
查看次数

是否有令人信服的理由在Perl正则表达式中使用量词而不是仅仅重复该字符?

我正在为一位同事进行代码审查,他的正则表达式如下所示:

if ($value =~ /^\d\d\d\d$/) {
    #do stuff
}
Run Code Online (Sandbox Code Playgroud)

我告诉他他应该改成:

if ($value =~ /^\d{4}$/) {
    #do stuff
}
Run Code Online (Sandbox Code Playgroud)

他回答说他更喜欢第一个可读性(我发现第二个更具可读性,但这是一个宗教辩论,我将保存另一天).

我的问题:一个人对另一个人有实际的好处吗?

regex perl

10
推荐指数
4
解决办法
309
查看次数

在Perl中获得UTC偏移的最佳方法是什么?

我需要在跨平台(Windows和各种Unix版本)方式中获取Perl中当前时区的UTC偏移量.它应符合以下格式:

zzzzzz,代表与UTC相关的±hh:mm

看起来我应该能够通过它strftime(),但它看起来并不一致.

Unix的:

Input: perl -MPOSIX -e "print strftime(\"%z\", localtime());"
Output: -0700
Run Code Online (Sandbox Code Playgroud)

视窗:

Input: perl -MPOSIX -e "print strftime(\"%z\", localtime());"
Output: Mountain Standard Time
Run Code Online (Sandbox Code Playgroud)

虽然看起来Unix给了我想要的东西(或者至少接近一些东西),但Windows却没有.我很确定我可以用Date::Time或者类似的方式来做,但是我真的希望不会因为我们广泛的安装基础而无法保证用户会有任何依赖.

我错过了一些明显的东西吗?提前致谢.

formatting perl timestamp

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

为什么此批处理脚本中的FOR/f循环评估空行?

我正在尝试编写一个批处理脚本,该脚本可以获取(除其他外)计算机所有磁盘驱动器的列表.基本代码看起来像这样:

REM Build the list of disk drives to monitor
SETLOCAL enabledelayedexpansion
FOR /f "skip=1 tokens=1 delims=:" %%a in ('"WMIC logicaldisk WHERE drivetype=3 GET deviceid"') do (
    SET "DISK_DATABASES=!DISK_DATABASES!%%a|"
    SET "DRIVES_TO_MONITOR=!DRIVES_TO_MONITOR!%%a:\\|"
)
Run Code Online (Sandbox Code Playgroud)

我显然构建了两个格式略有不同的列表供以后使用.然而,当我运行它时,我得到的输出看起来像这样:

C|D|E||
C:\\|D:\\|E:\\|:\\|
Run Code Online (Sandbox Code Playgroud)

现在,我希望两种情况下的尾随管道都可以管理,但我真的很困惑,为什么还有一个额外的空白条目.如果我wmic手动运行命令,我可以看到输出结尾确实有一个空行,但我的理解是/f特别应该忽略空行.

如果我打开ECHO,看起来最后一行只是作为回车/换行符或类似物进入.有没有办法做我期待的事情?我错过了什么吗?我试图if在循环中写一个条件来排除最后一行,但它是......时髦而且从未奏效.我感谢任何/所有的帮助.

batch-file

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