我有一个阵列,比方说
@array = qw(11 12 13 14 15);
Run Code Online (Sandbox Code Playgroud)
我想执行一些操作并检查一个条件.如果条件满足,我将退出我的程序,但如果不满足,我想以字典顺序更新我的数组到下一个排列,即尝试使用@ array = qw(11 12 13 15 14);
目前我正在使用此代码:
sub permute {
return ([]) unless (@_);
return map {
my @cdr = @_;
my $car = splice @cdr, $_, 1;
map { [$car, @$_]; } &permute(@cdr);
} 0 .. $#_;
}
my @array = qw(11 12 13 14 15);
foreach ( &permute(@array) ) {
if ( condition met ) {
print "@$_";
exit;
}
}
Run Code Online (Sandbox Code Playgroud)
问题:此代码运行子置换次数太多次.如果数组大小很大,这会大大减慢我的程序.我不想要所有的排列,只要我的条件不满足,我只需要下一个排列.假设100个排列是可能的,我想从1st开始.如果条件满足,退出else移动到2nd,3rd等等.所以,我希望方法permute只运行以找到下一个排列而不是全部.
请帮忙.
我想在一段代码之外维护一个数组.我感兴趣的数组是@ csv2years.这当前在一组花括号中,其中包含for循环的代码.我意识到我需要重新排列这个,以便大括号不包含创建数组的条件.我不知道如何在没有该for { }部分的情况下专门引用csv2 .
#!/bin/perl
# creates subroutines for discovering year
sub find_year {
my ( $str ) = @_;
my $year;
$year = $1 if( $str =~ /\b((?:19|20)\d\d)\b/ );
return $year
}
#####CREATE CSV2 DATA
my @csv2 = (); # Creates new empty array @csv2
open CSV2, "<csv2" or die; # Creates the file handle CSV2, inputs the data from csv2 into CVS2
@csv2=<CSV2>; # populates @csv2 array with data from file handle CSV2 …Run Code Online (Sandbox Code Playgroud) 当我在命令行中使用以下命令时,它给出了非集成更改列表的列表.
p4 interchanges -t $branch1 @$date1, @$date2 $branch2 > changes.txt
Run Code Online (Sandbox Code Playgroud)
但是,当我在Perl脚本中使用此命令时,如下所示,它不提供输出:
$cmd = system ("p4 interchanges -t $branch1 @$date1, @$date2 $branch2 > changes.txt");
Run Code Online (Sandbox Code Playgroud)
命令行中的输出消息是一些错误,如下所示:
branch1, - all revision(s) already integrated.
Run Code Online (Sandbox Code Playgroud)
问题是因为date1和date2之间使用了逗号?如何在Perl脚本中使用此命令?
我的引用数组指向另一个数组时遇到问题.这是我的代码片段:
# @bah is a local variable array that's been populated, @foo is also initialized as a global variable
$foo[9] = \@bah;
# this works perfectly, printing the first element of the array @bah
print $foo[9][0]."\n";
# this does not work, nothing gets printed
foreach (@$foo[9]) {
print $_."\n";
}
Run Code Online (Sandbox Code Playgroud) 我想分割列并使用正则表达式获取数据.使用反向引用寻找更简单的解决方案.
previous balance payments adjustments charges payment without fine payment with fine
20,251.97 - 0.00 - 0.00 + 53,391.67 = 73,643.64 74,393.64
这是代码
#!/usr/bin/perl
use strict;
my $regex = qr/^(\d|-)?(\d|,)*\.?\d*$/;
my $data = "20,251.97 - 0.00 - 0.00 + 53,391.67 = 73,643.64 74,393.64"
Run Code Online (Sandbox Code Playgroud) %s = ( t2* => [ a,b,x],
IAm => 'ALL' ) ;
my $key = 't2000' ;
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,t2*匹配$key,但我无法检索相应的哈希值.
当密钥是正则表达式时,检索值的最佳方法是什么?
我无法提取可能同时是FQDN和简单主机名的主机名
例如,使用sed它可以正常工作:
echo test_serv1.TEST-Site-1.test.com|sed 's/\..*//'
test_serv1
echo test_serv1|sed 's/\..*//'
test_serv1
Run Code Online (Sandbox Code Playgroud)
但是在Perl中我只得到它的FQDN:
my $t='test_serv1.TEST-Site-1.test.com';
my ($res) = $t=~ /^(.*?)\./;
print "$res\n";
Run Code Online (Sandbox Code Playgroud)
我为test_serv1尝试了不同的组合,但它不起作用,为什么?
在探索sarathi 当前文件行号问题的另一个答案时,我写了这个单行,期望它将打印所有提供的文件的第一行:
$ perl -ne 'print "$ARGV : $_" if __LINE__ == 1;' *txt
Run Code Online (Sandbox Code Playgroud)
这没有按预期工作; 所有的线都印了.
运行单行-MO=Deparse显示表示条件不存在.我假设这是因为它在编译时被恒定折叠:
$ perl -MO=Deparse -ne 'print "$ARGV : $_" if __LINE__ == 1;' *txt
LINE: while (defined($_ = <ARGV>)) {
print "$ARGV : $_";
}
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
但为什么?
在Perl 5.8.8下运行.
我需要将当前目录的尾部部分变为变量.我可以做一个
use Cwd;
my $dir = getcwd;
Run Code Online (Sandbox Code Playgroud)
得到完整的路径:usr\bjm\scPDB_entries\4dpt但我真正需要的是' 4dpt'从路径的其余部分分离出来.
谢谢!
$a ="SCNSC: SME@companay.isa.come";
$b ="alerts: nek";
$c ="daily-report: tasd,dfgd,fgdfg,dfgdf,sdf@dfs.com";
print "matched" if ($a =~ /\w+:\s*\w+@\w+\.\w+/ );
print "matched" if ($b =~ /\w+:\s*\w+[,\w+]{0,}/ );
print "matched" if ($c =~ /\w+:\s*\w+[,\w+]{0,}/ );
Run Code Online (Sandbox Code Playgroud)
它没有显示匹配