最近我开始在我的项目中使用 git 子模块。我的一个脚本创建了一个带有子模块的 repo。我想创建一个函数来检查子模块是否已成功初始化。
有哪些好的迹象需要验证?
我想,我们首先应该检查.git
主 repo 中是否有目录。然后我应该检查每个子模块,但是为了什么?
希望我的问题是可以理解的,如果不是,我很乐意指定更多。
这应该很容易,但我找不到一种干净的方法来做到这一点。我试图在路径中获取父目录的父完整路径。考虑以下路径:/bin/src/config/file
,我想/bin/src/config
进入Java。所以我得到一个字符串,需要得到父目录的完整路径(绝对路径,不仅仅是名称而不是相对路径)。最干净的方法是什么?
我试图找到类似于我的问题的先前线程,但没有找到.
考虑一个获取数组和数字的函数.我想找到下一个更高的数字.
例:
输入: arr = {2,5,3,8,15,10}, number = 6
输出:8
因为6 < 8
.
在Perl中执行此操作的最佳算法是什么?
编辑:我尝试了什么:
my @arr = (2,5,3,8,15,10);
my $number = 6;
my $next_largest = 10000000;
foreach my $val (@arr) {
if($number < $val && $next_largest > $val) {
$next_largest = $val;
}
}
if(defined($next_largest)) {
print $next_largest."\n";
}
Run Code Online (Sandbox Code Playgroud)
有没有办法没有声明$next_largest = 10000000
?它看起来不太好,并且它不处理高于此值的值的情况.此外,如果我尝试$next_lergest
没有数字,它不起作用.
我认为最好 - 最好看(时间并不重要).
我正在尝试使用哈希处理时调试一些奇怪的行为Perl
.我正在将哈希(不是引用)传递给子例程,并且由于某种原因它会更新它.
some_sub($a,%{$hash});
sub some_sub {
my ($a,%hash) = @_;
my @struct;
while (my ($dir, $data) = each %hash) {
foreach my $id (keys(%{$data})) {
my $entry = $data->{$id};
$entry->{id} = $id;
my $parent = $data->{$entry->{id}};
unless ($parent) {
push @struct, $entry
} else {
push @{$parent->{children}},$entry;
}
}
}
}
my %h= %{$hash};
print Dumper(\%h);
Run Code Online (Sandbox Code Playgroud)
sub some_sub
确实发生了变化,%hash
但仅适用于内部范围,因此不应更改外部数据%hash
.此外,我将散列作为哈希传递,而不是散列引用.我怀疑子some_sub
插入内存地址%hash
,但我不确定.
我该如何调试并解决这个问题?
编辑:我还尝试将哈希引用传递给子例程,并在对新哈希执行所有操作时将哈希引用解除引用到另一个哈希.
考虑以下代码:
final Set<String> allPaths = new HashSet<String>();
for (final String path: paths) {
allPaths.add(path);
}
final MyData d = new MyData(new ArrayList<String>(allPaths));
Run Code Online (Sandbox Code Playgroud)
MyData
是一些我不应该碰的类。它应该得到一个ArrayList
作为参数。在这一天之前,我们是这样使用的,因为我们不关心顺序,这就是我们使用的原因Set
(所以不会有重复)。但是现在,我想保持元素的顺序,所以经过一些研究,我发现我可以使用数据结构LinkedHashSet
来做到这一点。所以我做了:
final LinkedHashSet<String> allPaths = new LinkedHashSet<String>();
for (final String path: paths) {
allPaths .add(path);
}
final MyData d = new MyData(new ArrayList<String>(allPaths));
Run Code Online (Sandbox Code Playgroud)
问题是,我不确定如何转换LinkedHashSet
为ArrayList
. 另外,我想使用ArrayList
而不是LinkedHashSet
这样我就不必转换它,但我必须遍历数组 ( O(n)
)。
我应该使用什么好的、干净和有效的方式?
我想知道在以下条件下检查选项的最佳方法是什么:
如果我们谈论两个选项,那么很容易(例如在Perl中):
if(defined($a) && defined($b)) {
abort("Please use only one of the flags: a or b");
}
unless(defined($a) || defined($b)) {
abort(1,"Please use a or b");
}
Run Code Online (Sandbox Code Playgroud)
但是对于三种选择,它会有点混乱(太多ifs).有没有干净的方法呢?如果可能的话,不使用像xor
(仅if-else-unless
)这样的额外运算符.
什么是分叉进程的正确方法,每个进程运行不同的子例程sub1,sub2,...,subN
.在阅读了很多以前的主题和材料之后,我觉得我理解逻辑但是对于如何以最干净的方式编写有点困惑(可读性对我来说很重要).
考虑4个潜艇.他们每个人都有不同的论点.感觉最有效的方法是创建7个叉子,每个叉子将运行不同的子.代码看起来像这样:
my $forks = 0;
foreach my $i (1..4) {
if ($i == 1) {
my $pid = fork();
if ($pid == 0) {
$forks++;
run1();
exit;
}
} elsif ($i == 2) {
my $pid = fork();
if ($pid == 0) {
$forks++;
run1();
exit;
}
} elsif ($i == 3) {
my $pid = fork();
if ($pid == 0) {
$forks++;
run1();
exit;
}
} elsif ($i == 4) {
my $pid = fork();
if …
Run Code Online (Sandbox Code Playgroud) 我想在Perl中编写一个正则表达式,它将删除字符串中最后一个逗号之后的所有内容.我知道最后一个逗号之后的子字符串是一个数字或其他一些子字符串,所以没有逗号.
示例:some\string,/doesnt-really.metter,5
.
我想正则表达式删除最后一个逗号,5
所以输出将是:some\string,/doesnt-really.metter
我不允许仅使用正则表达式使用任何其他模块.那么我应该使用哪个正则表达式?
另一个例子:
string_with,,,,,_no_point,some_string => string_with,,,,,_no_point
我可以在Perl中使用以下两种方式:
my $str = "hello";
my $o1 = $str." world";
my $o2 = "$str world";
Run Code Online (Sandbox Code Playgroud)
他们做同样的事情,虽然我想知道他们在谈论表现时是否相同.我怎么检查呢?有没有一个特殊的在线工具?
我正在尝试创建一个获取参数的脚本(用Perl编写).调用应如下所示:
./script [action] --option1 --option2 ... --optionK
Run Code Online (Sandbox Code Playgroud)
我使用GetOptions:Long
模块.我也用它$ARG[0]
来获取动作.例:
./script report --color black --version 19.4
Run Code Online (Sandbox Code Playgroud)
现在我想向用户提供插入他想要的任何命令的权力(例如,它可以插入带参数的另一个脚本).我这样做是这样的:用户可以在命令行参数的末尾(仅)插入他想要的任何东西,例如:
./script report --color black --version 19.4 more and more --info 551_5 from --the user
Run Code Online (Sandbox Code Playgroud)
我想解析这个数组@ARGV
并将其他信息插入变量:
$additional = "more and more --info 551_5 from --the user"
Run Code Online (Sandbox Code Playgroud)
我发现在使用之后GetOptions
,它将$ARGV[0]
从@ARGV
数组中删除这些选项(不包括).问题是,我真的不知道如何从阵列中获取附加信息.也许我应该添加一个额外的选项,如下所示:
./script report --color black --version 19.4 --additional more and more --info 551_5 from --the user
Run Code Online (Sandbox Code Playgroud)
把一切都搞定additional
.但这种方式,我有一个问题-它将把--info
和--the
作为参数.
我该如何解决这个问题?
编辑:我看到pass_through
可以使用.但是如果用户有一个类似于我可用选项的选项呢?它可能会有一些问题.是否可以像字符串一样处理它?同样,我将不得不解析 …
我有一个文件,每行都有一个路径.我将这些行插入数组@dirs
.一些路径包括环境变量.带路径的有效文件的示例:
/some/valid/path
$HOME/dir
$SOME_ENV/dir
Run Code Online (Sandbox Code Playgroud)
每个路径,我想检查它是否包含一个名为的文件abc
.所以我使用:
foreach my $dir (@dirs) {
chmod($dir);
my $file = $dir."/"."abc";
print "invalid dir: $dir" unless((-e $file) && (-s $file));
}
Run Code Online (Sandbox Code Playgroud)
但是,由于某种原因,它无法识别环境变量,这意味着它即使$SOME_ENV/dir
包含abc
文件也会失败.
此外,如果我按如下方式使用它,脚本会识别这些环境变量:
print $ENV{SOME_ENV}."\n";
print $ENV{HOME}."\n";
Run Code Online (Sandbox Code Playgroud)
此外,我试图用abs_path
的的Cwd
模块,以获取路径的真实路径(所以它不会包括环境变量),但它也不能识别环境变量.
为什么(-e $file)
不承认环境变量?我该如何解决这个问题?