Perl:获取字符串的所有可能情况的数组

时间:2015-07-17 10:53:09

标签: string perl permutation glob case-insensitive

我需要获取一个字符串的所有可能情况的数组。就像它写在这里:

Combination of all possible cases of a string

如何有效地在 Perl 中执行此操作?

我想要这样的事情:

print "$_\n" for GetCases('perl');

# Output:
perl
Perl
...
pERl
...
PERL

注意

我标记了glob,因为它是我想要提供结果的功能,所以像我这样的人以后会找到问题。但是,问题不仅仅在于这种特殊用法。

相关问题:Should I insert some code when asking for idea?

2 个答案:

答案 0 :(得分:3)

如果你打算在glob使用if,那么你可以使用glob的内置模式生成

my $filename = 'File.CSV';

my $test = $filename =~ s/([a-z])/sprintf '{%s,%s}', uc($1), lc($1)/iegr;

say $test, "\n";
say for glob $test;

输出

{F,f}{I,i}{L,l}{E,e}.{C,c}{S,s}{V,v}

FILE.CSV
FILE.CSv
FILE.CsV
FILE.Csv
FILE.cSV
FILE.cSv
FILE.csV
FILE.csv
FILe.CSV
FILe.CSv
FILe.CsV
FILe.Csv
FILe.cSV
FILe.cSv
FILe.csV
FILe.csv
FIlE.CSV
FIlE.CSv
FIlE.CsV
FIlE.Csv
FIlE.cSV
FIlE.cSv
FIlE.csV
FIlE.csv
FIle.CSV
FIle.CSv
FIle.CsV
FIle.Csv
FIle.cSV
FIle.cSv
FIle.csV
FIle.csv
FiLE.CSV
FiLE.CSv
FiLE.CsV
FiLE.Csv
FiLE.cSV
FiLE.cSv
FiLE.csV
FiLE.csv
FiLe.CSV
FiLe.CSv
FiLe.CsV
FiLe.Csv
FiLe.cSV
FiLe.cSv
FiLe.csV
FiLe.csv
FilE.CSV
FilE.CSv
FilE.CsV
FilE.Csv
FilE.cSV
FilE.cSv
FilE.csV
FilE.csv
File.CSV
File.CSv
File.CsV
File.Csv
File.cSV
File.cSv
File.csV
File.csv
fILE.CSV
fILE.CSv
fILE.CsV
fILE.Csv
fILE.cSV
fILE.cSv
fILE.csV
fILE.csv
fILe.CSV
fILe.CSv
fILe.CsV
fILe.Csv
fILe.cSV
fILe.cSv
fILe.csV
fILe.csv
fIlE.CSV
fIlE.CSv
fIlE.CsV
fIlE.Csv
fIlE.cSV
fIlE.cSv
fIlE.csV
fIlE.csv
fIle.CSV
fIle.CSv
fIle.CsV
fIle.Csv
fIle.cSV
fIle.cSv
fIle.csV
fIle.csv
fiLE.CSV
fiLE.CSv
fiLE.CsV
fiLE.Csv
fiLE.cSV
fiLE.cSv
fiLE.csV
fiLE.csv
fiLe.CSV
fiLe.CSv
fiLe.CsV
fiLe.Csv
fiLe.cSV
fiLe.cSv
fiLe.csV
fiLe.csv
filE.CSV
filE.CSv
filE.CsV
filE.Csv
filE.cSV
filE.cSv
filE.csV
filE.csv
file.CSV
file.CSv
file.CsV
file.Csv
file.cSV
file.cSv
file.csV
file.csv

答案 1 :(得分:1)

我会考虑:

  • 循环了多种可能性。 (2 ^长度)。
  • 以二进制形式打印'count',因为这会给出一点掩码。
  • 使用该位掩码在每次迭代时翻转位。

这样的事情:

#!/usr/bin/env perl

use strict;
use warnings;

my $string = "abcde";

for my $mask ( 0 .. 2**length($string) - 1 ) {
    my @bits = split( '', sprintf( "%0" . length($string) . "b\n", $mask ) );

    for ( split( '', $string ) ) {
        if ( shift @bits ) {tr/a-z/A-Z/}
        print;
    }
    print "\n";
}

这适用于转换的纯字母字符串,但它总是会生成2 ^长度的字符串,而不是字母的任何字符都会产生重复。

'abcdef'将为'abcdeF,abcdEf,abcdEF ... ABCDEF'生成案例变体。但是'12345678'将生成256个相同的字符串。

如果有问题,处理这种情况的最简单方法是使用字符串的哈希而不是数组,并使用keys来提取唯一身份。

但是,正如您在评论中所说:

  

我需要不区分大小写的glob来查找文件夹中的所有文件,无论如何。由于我无法使用不区分大小写的字符串工作,我认为将字符串的所有可能情况提供给它是最好的方法。在我看来,Perl没有更好的语言来应对这些事情,但我不知道如何在没有猴子代码的情况下做到这一点。

您想要的是File::Glob - 特别是:nocase参数。