我需要获取一个字符串的所有可能情况的数组。就像它写在这里:
Combination of all possible cases of a string
如何有效地在 Perl 中执行此操作?
我想要这样的事情:
print "$_\n" for GetCases('perl');
# Output:
perl
Perl
...
pERl
...
PERL
注意
我标记了glob
,因为它是我想要提供结果的功能,所以像我这样的人以后会找到问题。但是,问题不仅仅在于这种特殊用法。
答案 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)
我会考虑:
这样的事情:
#!/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
参数。