如何在Perl中正确定义匿名标量引用?
my $scalar_ref = ?;
my $array_ref = [];
my $hash_ref = {};
我试图用连字符连接两个或三个变量.请查看以下示例.
my $QueueName = Support;
my $CustomerID = abc;
my $UserCountry = India;
my $Count = 12345;
my $Tn = $QueueName.$CustomerID.$UserCountry.$Count;
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
"$Tn" = SupportabcIndia12345
Run Code Online (Sandbox Code Playgroud)
但我希望这样:
$Tn = Support-abc-India-12345
Run Code Online (Sandbox Code Playgroud) 我有一些数据应该可以很容易地分成哈希.
以下代码旨在将字符串拆分为其对应的键/值对,并将输出存储在散列中.
码:
use Data::Dumper;
# create a test string
my $string = "thing1:data1thing2:data2thing3:data3";
# Doesn't split properly into a hash
my %hash = split m{(thing.):}, $string;
print Dumper(\%hash);
Run Code Online (Sandbox Code Playgroud)
但是,在检查输出时,很明显该代码不能按预期工作.
输出:
$VAR1 = {
'data3' => undef,
'' => 'thing1',
'data2' => 'thing3',
'data1' => 'thing2'
};
Run Code Online (Sandbox Code Playgroud)
为了进一步研究这个问题,我将输出分成一个数组,然后打印出结果.
码:
# There is an extra blank element at the start of the array
my @data = split m{(thing.):}, $string;
for my $line (@data) {
print "LINE: $line\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
LINE:
LINE: …Run Code Online (Sandbox Code Playgroud) 有没有办法将Moose提供的默认构造函数重命名为"new"以外的其他东西?
我想这样做是为了使脚本更加用户友好,因为将构造函数命名为不同的东西更有意义(比如"make_thing")
my $object = Class->make_thing();
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
让我举个例子说明这可能对用户更友好......
假设我正在构建一个处理CVS存储库信息的模块,该模块称为"CVS".我可以使用创建存储库的实例
$repository = CVS->new()
或者,如果我可以更改构造函数的名称,我可以称之为
$repository = CVS->get_repository()
这将使用户更具逻辑意义.
Perl允许您使用名为的函数捕获对未定义方法的调用AUTOLOAD.每当你调用一个Perl找不到的AUTOLOAD方法时,它会查找一个方法并调用它.这可以以许多不同的方式使用.有关更多信息,请参阅:AUTOLOAD
最近我进入了C++,很奇怪是否有办法在C++程序中模拟这种功能.我知道C++中的所有东西都需要在编译时定义很多,这使得这个问题变得棘手,但我想必须有一些技术涉及模板或其他一些技巧,至少可以接近.
你能AUTOLOAD在C++中获得最接近Perl的功能是什么?
我正在设计可以在我的其他C ++项目中链接的库的集合。为了使该集合易于使用,我希望能够链接到各个库,或者链接到包含所有其他库的一个主库。如何在CMakeLists.txt文件中指定?
例如:
add_library(library1 SHARED
file1.cpp
file2.cpp
)
add_library(library2 SHARED
file3.cpp
file4.cpp
)
# Define a master library that contains both of the others
add_library(master_library SHARED
library1
library2
)
Run Code Online (Sandbox Code Playgroud)
是否有使用CMake获得此功能的正确方法?
这个问题不是重复的:CMake:是否可以仅从静态库而不从源构建可执行文件?
这仅与共享库有关,与静态库或可执行文件无关。
我正在尝试使用Perl实现一个非常简单的语法来读取和写入数据库.基本上,最终目标是能够访问数据库中的字段,就好像它们是一个简单的Perl哈希一样.
不幸的是,我试图访问的数据库类型及其API是专有的,因此我无法详细了解如何实际读取和写入数据,只是假设数据库名称是足够的信息来连接.在Perl中需要做的是使这项工作非常通用,因此API信息不应该相关.
首先,我要创建一个简单的数据库对象:
my $database = Database->new('NAME');
Run Code Online (Sandbox Code Playgroud)
然后我想从数据库中读取一个我想要读取的字段名称:
# Read from the database
my $value = $database{'field_name'};
# Write to the database
$database{'field_name'} = $value;
Run Code Online (Sandbox Code Playgroud)
每次从哈希读取数据时,我都希望它调用一个函数来查询数据库并获取值.
每次将数据写入散列时,我都希望它调用一个函数将数据写入数据库.
这是我到目前为止:
Database.pm
package Database;
use overload '%{}' => \&access_data;
sub new {
my $class = shift;
my $name = shift;
my $self = bless {
name => $name
}, $class;
return $self;
}
sub access_data {
my $self = shift;
my $field = shift;
my $data = shift;
if (defined $data) {
# …Run Code Online (Sandbox Code Playgroud) 我正在尝试在一个相对复杂的项目中编写一些 CMake 代码,并且我有一个内部包含另一个模块的模块。问题是,每当我包含我的模块时,它内部包含的模块中定义的所有功能都在全局级别可用!这实际上是用一堆我没有明确要求的函数污染了我的全局命名空间。
例如:
# CMakeLists.txt
# Include my module
include(MyModule)
# Call a function from my module
my_module_function()
# HERE IS THE PROBLEM -- functions from "AnotherModule" are visible here!
# This call works
another_module_function()
Run Code Online (Sandbox Code Playgroud)
在我的模块内:
# MyModule.cmake
# Include another module
# - This other module is written and supported by someone else so I can't modify it
# - No functions from "AnotherModule" will be used outside of "MyModule"
include(AnotherModule)
# Define my function
function(my_module_function)
# Call …Run Code Online (Sandbox Code Playgroud) 我遇到过这样的情况:一些之前签入 Git 的文件现在需要被忽略。为了忽略它们,我将文件添加到“.gitignore”并执行了以下操作:
git rm -r --cached .
git add --all
git commit -m "Removed files from git tracking that should be ignored"
git push
Run Code Online (Sandbox Code Playgroud)
现在我遇到一种情况,我需要将这些“.gitignore”更改拉到另一台服务器,但是当我执行此操作时,git pull刚刚添加到“.gitignore”的文件不会被忽略,而是会被完全删除!
我认为发生的事情是在拉取过程中它使用本地“.gitignore”文件,该文件不会忽略这些文件......并且它检测到这些文件不再在 git 中,因此它只是删除它们。如果我手动添加回文件并执行另一个 git pull 然后它开始正常工作(现在正确的“.gitignore”文件位于服务器上。)
有没有办法告诉git pull使用来自远程服务器的“.gitignore”文件而不是本地文件,这样这些文件就可以被正确忽略并且不会在 git pull 上被删除?
我正在编写一个多线程程序,并且有一个函数可以从多个线程调用,该函数是 cpp 文件中的静态自由函数。这个函数永远不会从 cpp 文件外部调用,所以我想让它成为静态的,以便它有内部链接。
谷歌搜索我发现很多人说“静态函数不是线程安全的”但是当我去阅读它时,每个人似乎都在谈论静态成员函数,而不是静态自由函数。
静态自由函数线程安全吗(假设它们不访问线程之间的任何共享状态)?