小编Zai*_*aid的帖子

Perl一个一个地排列数组的所有排列

我有一个阵列,比方说

@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只运行以找到下一个排列而不是全部.

请帮忙.

arrays algorithm perl

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

在不使用花括号的情况下创建Perl数组,以便数组不限于特定块

我想在一段代码之外维护一个数组.我感兴趣的数组是@ 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)

arrays perl for-loop

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

两个分支之间的非集成变更列表

当我在命令行中使用以下命令时,它给出了非集成更改列表的列表.

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脚本中使用此命令?

perl perforce

0
推荐指数
1
解决办法
237
查看次数

针对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)

perl multidimensional-array

0
推荐指数
1
解决办法
122
查看次数

使用Perl处理数据列

我想分割列并使用正则表达式获取数据.使用反向引用寻找更简单的解决方案.

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)

perl

0
推荐指数
1
解决办法
119
查看次数

如何使用我的哈希键作为正则表达式来检索值?

%s = (  t2* => [ a,b,x],
        IAm => 'ALL' ) ;

my $key = 't2000' ;
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,t2*匹配$key,但我无法检索相应的哈希值.

当密钥是正则表达式时,检索值的最佳方法是什么?

perl

0
推荐指数
1
解决办法
899
查看次数

为什么我的Perl正则表达式不匹配简单的主机名?

我无法提取可能同时是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尝试了不同的组合,但它不起作用,为什么?

regex perl regex-greedy

0
推荐指数
1
解决办法
695
查看次数

_LINE__在这个Perl单线程中是否经常折叠?

在探索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下运行.

perl constantfolding

0
推荐指数
1
解决办法
123
查看次数

如何在perl中拆分当前目录

我需要将当前目录的尾部部分变为变量.我可以做一个

use Cwd;
my $dir = getcwd;
Run Code Online (Sandbox Code Playgroud)

得到完整的路径:usr\bjm\scPDB_entries\4dpt但我真正需要的是' 4dpt'从路径的其余部分分离出来.

谢谢!

perl path

0
推荐指数
1
解决办法
145
查看次数

我的正则表达式不匹配

$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)

它没有显示匹配

regex perl

-1
推荐指数
1
解决办法
278
查看次数