好吧..。因此,我试图用Crunch和Grep制作一个字典,我也尝试使用Perl。
crunch 8 12 1234567890 -d 2@ | grep -v '\([0-9]\) .*\1.*\1.*\1.*' | grep 41106041
所以,基本上,我想过滤所有密码,其中数字出现3次。
grep 41106041
只是测试代码是否有效..。但事实并非如此。
我还尝试了一些"C样式“perl代码,因为我仍然是perl的新手:
#! /bin/perl
@lines=<STDIN>;
$c=0;
foreach $number(@lines)
{
$acum=undef;
$pos=0;
while($pos <= &countdig($number))
{
if ($acum=$digit)
{
$c=$c+1;
}
else
{
$c=0;
}
$acum=$digit;
}
if ($c=3)
{
print "$number"." ";
}
$c=0;
}
sub countdig
{
my($j)=0;
chomp(my(@n)=@_);
print "first dig $n[$j] \n";
while($_[0][$j]>=0 && $_[0][j]<=9)
{
$j+=1;
}
print "j total : $j \n";
$j;
}
伯爵被认为是数位数,但事情是..。我不能以列表的形式访问标量变量。所以,如果你们能解释我如何使它工作,这将是非常感谢的。
发布于 2016-10-01 04:32:02
您的grep
失败了,因为您的模式中有一个空闲空间,您正在搜索4个相同的数字(其中一个是捕获的,再加上三个是通过反向引用获得的)。
$ printf '12345678\n41106041\n87654321\n' | grep -v '\(.\).*\1.*\1'
12345678
87654321
问题不是成为Perl的新手,因为C解决方案很容易实现。
// For each line
char *num = ...;
int digits[10];
for (int i=0; i<10; ++i) {
digits[i] = 0;
}
const char *p = num;
int triple = 0;
for (; *p && *p != '\n'; ++p) {
if (++digits[*p - '0'] == 3) {
triple = 1;
break;
}
}
if (triple) {
...
}
转换为Perl解决方案
while (my $num = <>) {
chomp($num);
my @digits;
my $triple;
for my $digit (split //, $num) {
if (++$digits[$digit] == 3) {
$triple = 1;
last;
}
}
say $num if $triple;
}
当然,Perl程序员很可能使用与grep
相同的方法。
while (<>) {
if (!/(.).*\1.*\1/) {
print;
}
}
发布于 2016-10-01 04:27:41
echo 41106041 | grep -v '\([0-9]\).*\1.*\1.*
https://stackoverflow.com/questions/39802403
复制相似问题