【问题标题】:grep alternative in perlperl 中的 grep 替代方法
【发布时间】:2017-07-11 05:59:14
【问题描述】:

我正在使用grepsort 命令来获取文件中所有变量名的唯一列表。但是它不适用于 Perl。

/tmp/a.txt

 Hello
 A
 A
 $TEST
 $ABC
 $HELLO
 $HELLO

Unix 命令

grep -o '\$\<[^/ ]*\>' /tmp/a.txt | sort -u
$ABC
$HELLO
$TEST

Perl

my @Var = ` grep -o /\/$\<[^/ ]*\>/ /tmp/a.txt | sort -u`;

【问题讨论】:

  • 为什么要在 Perl 中编写 bash 代码?使用 Perl 语言来解决问题几乎总是比使用较少的语言更好。

标签: regex perl unix


【解决方案1】:

使用 Perl 会容易得多。

#!/usr/bin/perl

use strict;
use warnings;

use feature 'say';

my %seen;
say for sort grep { chomp; /\$/ and ! $seen{$_}++ } <>;

如果将此程序保存在当前目录中名为 grepit 的文件中,则可以在 bash 命令提示符下这样调用它:

$ ./grepit /tmp/a.txt

如果你愿意,你可以把它分散一点:

#!/usr/bin/perl

use strict;
use warnings;

use feature 'say';

my %seen;
my @vars;

while (<>) {

  next unless /\$/;

  chomp;

  next if $seen{$_}++;

  push @vars, $_;
}

for ( sort @vars ) {
  say;
}

【讨论】:

  • 我不认为这对 Perl 来说是一个很好的广告。你在炫耀吗?第一个程序看起来像一个 awk 解决方案,前面有一堆样板。它还打印包含至少一个美元符号的任何行,可以轻松改进
【解决方案2】:
#!/usr/bin/perl 
use strict; use warnings; use Data::Dumper;
my $cmd = 'grep -o "\$\<[^/ ]*\>" a.txt | sort -u';
my @var= `$cmd`; 
chomp(@var);
print Dumper(\@var);

输出:

$VAR1 = [
    '$ABC',
    '$HELLO',
    '$TEST'
];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多