小编tjw*_*992的帖子

附加到csh中可能尚不存在的环境变量的简单方法

我试图在我的PERL5LIB环境变量的末尾附加一个路径,但我不确定这个变量是否总是存在.如果它不存在,我想简单地将它初始化为我试图追加的值.

这是一个有效的例子:

if ( $?PERL5LIB ) then
    setenv PERL5LIB ${PERL5LIB}:/some/other/path
else
    setenv PERL5LIB /some/other/path
endif
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但它仍然看起来很笨重,因为我必须基本上写两次同一行.我想做的是提出一个更有效的单线解决方案(可能使用参数扩展).

有没有办法将其合并为一条线?(或者多行不涉及多次写出"/ some/other/path")


例如,这可以在bash中完成:

export PERL5LIB=${PERL5LIB:+${PERL5LIB}:}/some/other/path
Run Code Online (Sandbox Code Playgroud)

csh environment-variables login-script parameter-expansion

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

Perl脚本随着它的进展而变慢

我编写了一个编译显示的Perl脚本,以便用户可以查看它们.有成千上万的这些显示文件(DSET文件)需要编译,这个过程需要很长时间(4-5小时).使用外部可执行文件编译显示(我没有关于此可执行文件的内部工作的详细信息).

作为加速流程的解决方案,我们决定并行运行此可执行文件的多个实例,以大幅提高性能.

在使用16个线程运行时,性能显着提高,现在需要大约1小时才能完成,而不是4-5,但仍然存在问题.随着脚本的进行,此可执行文件运行的时间也在增加.

我对大约1000个DSET文件进行了测试,并在Perl脚本进行过程中监视外部编译程序的执行时间.下面是执行时间随时间增加的图表.

表现情节

如您所见,当脚本启动时,Perl脚本需要大约4秒才能打开可执行文件,编译DSET然后关闭可执行文件.一旦脚本处理了大约500个DSET,编译每个后续DSET所花费的时间就会增加.当脚本接近结束时,一些DSET文件需要12秒才能编译!

以下是每个线程执行的函数示例:

# Build the displays
sub fgbuilder {
    my ($tmp_ddldir, $outdir, $eset_files, $image_files) = @_;

    # Get environment variables
    my $executable = $ENV{fgbuilder_executable};
    my $version    = $ENV{fgbuilder_version   };

    # Create the necessary directories
    my $tmp_imagedir = "$tmp_ddldir\\images";
    my $tmp_outdir   = "$tmp_ddldir\\compiled";
    make_path($tmp_ddldir, $tmp_imagedir, $tmp_outdir);

    # Copy the necessary files
    map { copy($_, $tmp_ddldir  ) } @{$eset_files };
    map { copy($_, $tmp_imagedir) } @{$image_files};

    # Take the next DSET off of the queue
    while (my $dset_file …
Run Code Online (Sandbox Code Playgroud)

perl performance multithreading memory-management

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

共享线程变量而不使其全局化(Perl)

我正在尝试编写一个使用线程并共享变量的简单脚本,但我不希望将此变量设置为整个脚本的全局变量.下面是一个简化的例子.

use strict;
use warnings;
use threads;
use threads::shared;

my $val:shared;

# Create threads
for my $i (1 .. 5) {
    threads->create(\&do_something, $i);
}

# Wait for all threads to complete
map { $_->join(); } threads->list();

# $val is global to the script so this line will work!
print "VAL IS: $val\n";

sub do_something {
    my $i = shift;
    print "Doing something with thread $i!\n";

    {
        lock $val;
        $val = "SOMETHING IS $i";
        print "$val\n\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

用线程1做点什么!有些是1

用线程2做点什么!有些是2 …

perl multithreading scope lexical-scope

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

检查子例程是否在Perl中用作左值或右值

我正在编写一些代码,其中我使用子例程作为左值和右值来读取和写入数据库值.问题是,我希望它根据它是用作左值还是右值来做出不同的反应.

我希望子程序在用作左值时写入数据库,并在数据库用作右值时从数据库中读取.

例:

# Write some data
$database->record_name($subscript) = $value;

# Read some data
my $value = $database->record_name($subscript);
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一方法就是找到一种方法让子程序识别它是用作左值还是左值,并对每种情况做出不同的反应.

有没有办法做到这一点?

perl rvalue subroutine lvalue

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

C中的函数重载使用GCC - 编译器警告

我试图在C中实现函数重载,我非常接近.我正在使用C99,因此_Generic我无法使用C11中引入的关键字.我已经开发了一些工作代码,但是当我编译它时,我收到了一些警告.

工作范例:

#include <stdio.h>

#define print(x)                                                                        \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(x), int   ), print_int(x)   , \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(x), char[]), print_string(x), \
(void)0))


void print_int(int i) {
    printf("int: %d\n", i);
}

void print_string(char* s) {
    printf("char*: %s\n", s);
}

int main(int argc, char* argv[]) {

    print(1);
    print("this");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译会创建以下警告:

gcc overload.c -o main
overload.c: In function 'main':
overload.c:19: warning: passing argument 1 of 'print_string' makes pointer from integer without a cast
overload.c:20: warning: passing argument 1 of 'print_int' makes …
Run Code Online (Sandbox Code Playgroud)

c overloading c99 compiler-warnings c-preprocessor

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

Windows 7夏令时错误?

我正在尝试确定何时使用Perl localtime函数在Perl脚本中进行夏令时转换并使用打印时区strftime.

奇怪的是,这似乎适用于今年和其他近年来,但如果我尝试回到2000年,例如,Perl似乎认为过渡发生在错误的一天!

根据谷歌的说法,夏令时于2000年4月2日开始:

在此输入图像描述

...但由于某种原因,下面的Perl代码似乎不同意:

use POSIX qw(strftime);
use Time::Local;

# 03/12/2000 01:59:59
($year, $month, $day, $hour, $minute, $second) = (2000, 3, 12, 1, 59, 59);
$epoch = timelocal($second, $minute, $hour, $day, $month - 1, $year);

# Print the time
print strftime "%m/%d/%Y %H:%M:%S - %Z\n", localtime($epoch);

# 03/12/2000 02:00:00
($year, $month, $day, $hour, $minute, $second) = (2000, 3, 12, 2, 0, 0);
$epoch = timelocal($second, $minute, $hour, $day, $month - 1, $year);

# Print the time …
Run Code Online (Sandbox Code Playgroud)

perl time dst windows-7 windows-7-x64

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

Perl中的递归排序

我有一个包含与数据库下标对应的键的哈希,但数据库可以有多维记录,因此键可以是单个下标,也可以是下标列表.

我需要找到一种方法来对这些记录进行排序,以便我可以按逻辑顺序打印它们.

例:

my $data = {
    '1,1,1' => 'data1',
    '1,2'   => 'data2',
    '1,1,3' => 'stuff',
    '2,1,1' => 'data3',
    '2,1,2' => 'data4',
    '2,1,3' => 'data blah',
    '2,2,2' => 'datawk2n',
    '3,1,2' => 'more',
};

# Should print the keys in the properly sorted order
print join "\n", sort some_function keys %$data;

sub some_function {
    # Do some sorting magikz
}
Run Code Online (Sandbox Code Playgroud)

我希望它首先按最左边的下标排序.如果最左边的值相同,我想移动到下一个值并进行比较.如果那些是相同的,我想继续下一个...依此类推......直到所有可能性都用完为止.

这很可能涉及一些递归,但我无法弄清楚如何使递归与那些花哨$a$b变量一起工作.

我可以用什么some_function来获得以下输出?

1,1,1
1,1,3
1,2
2,1,1
2,1,2
2,1,3
2,2,2
3,1,2
Run Code Online (Sandbox Code Playgroud)

sorting recursion perl

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

Perl XS未使用的变量'Perl___notused'警告

我正在学习如何从Perl调用C++代码,并开始尝试从Perl脚本创建一个基本的C++对象.

为此,我开始执行h2xs命令:

h2xs -A -nMyClass

然后我将生成的以下两个参数添加Makefile.PL到使用g++编译器.

CC => 'g++',
LD => 'g++',
Run Code Online (Sandbox Code Playgroud)

我在.xs文件中创建了我的简单类,并编写了XS代码以使用Perl映射它

MyClass.xs

#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#ifdef __cplusplus
}
#endif

class MyClass {
public:
    MyClass(int value) {
        value_ = value;
    }
    ~MyClass() {}

    int value() { return value_; }

    void set_value(int value) {
        value_ = value;
    }
private:
    int value_;
};

MODULE = MyClass                PACKAGE = MyClass

MyClass *
MyClass::new(int …
Run Code Online (Sandbox Code Playgroud)

c++ perl g++ xs

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

Google测试-使用“ SetUpTestSuite”似乎无效

我正在尝试编写一个执行测试套件级别的“设置”操作的测试套件。

我试图首先编写一个简单的程序来尝试使其运行,但是我没有运气来调用“ SetUpTestSuite”方法。

#include <gtest/gtest.h>
#include <iostream>

class MyTest : public ::testing::Test
{
protected:
    static void SetUpTestSuite() {
        std::cerr << "TestSuiteSetup" << std::endl;
    }

    static void TearDownTestSuite() {

    }
};

TEST_F(MyTest, Case1) {
    std::cerr << "TESTING" << std::endl;
}

int main(int argc, char* argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到:

[==========] Running 1 tests from 1 test cases.
[----------] Global test environment set-up.

[----------] 1 test from MyTest
[ RUN      ] MyTest.Case1
TESTING
[       OK ] MyTest.Case1 (0 ms) …
Run Code Online (Sandbox Code Playgroud)

c++ automated-tests unit-testing googletest test-suite

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

找到具有非线性进展的最近值

这有点复杂,但请耐心等待.我正在尝试创建一个地图,将音符的名称与相应的频率相关联.然后我想编写一个函数,当提供随机频率时,将返回最接近该频率的音符.

这个问题是音符的频率不是用线性公式生成的,因此每个音符之间的确切中间频率也不是线性的.(这基本上意味着音符之间的中点不完全在中间,因此通过常规方法找到中点不起作用.)

一些示例代码用于生成注释地图:

// Ordered starting with "B" so notes line up with frequencies
vector<string> names = {
    "B", "C", "C#/Db", "D", "D#/Eb", "E", "F", "F#/Gb", "G", "G#/Ab", "A", "A#/Bb"
};

double f0 = 440;
map<string, map<int, double> > notes;

// Map notes to their corresponding frequencies
for (int octave = 0; octave < 10; ++octave) {
    for (int index = 0; index < names.size(); ++index) {

        // Get the exact frequency of the musical note
        double frequency               = f0*pow(pow(2, …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm math dictionary

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