我读使用perl脚本的文件。该文件由不同的字符的字符串,我应该找出包含字符“X”的字符串。我想知道应该怎么的(1)打印该字符串(包含“X”),并且还<强>(2)写此字符串到另一个文件(3)计数“X”的数量在整个文件中的字符即可。下面的脚本将再次打印整个文件。任何建议?

#!/use/bin/perl
use strict;
use warnings;

open (FILE, "/home/user/Desktop/infile.phy") || die "cant open file\n";
my @body = <FILE>;
close (FILE);
my $count= 0;
my $string = '';
foreach $_(@body){
    if ($_ =~ m/[X]/){
        print "$_";
        $count++;
        print $count;
    }
    else {
        print ;
    }
}
exit;
有帮助吗?

解决方案

由于这是代码审查,让我们去一一:

#!/use/bin/perl

这shebang行是最有可能的拼写错误。它可能应该是

#!/usr/bin/perl

或任何which perl回报您的系统上。

use strict;
use warnings;

好。

open (FILE, "/home/user/Desktop/infile.phy") || die "cant open file\n";

无需包全局文件句柄时,你可以使用词法文件句柄。 open的3参数形式是优选的,这些天。此外,该错误消息应表明您无法打开文件:

my $filename = '/home/user/Desktop/infile.phy';
open my $input, '<', $filename
    or die "Cannot open '$filename' for reading: $!";

my @body = <FILE>;

您啜文件到一个数组。即在这种情况下,完全不必要的。

my $count  = 0;
my $string = '';

声明和初始化(如有必要)在尽可能小的范围的任何变量。

my $count;

变量$string不使用任何其他地方在您的代码。

foreach $_(@body){

这是愚蠢的。 for使用$ _如果没有指定循环变量。这是比较容易让事情简单一点,如果你不是指定一个词法循环变量。

for my $line ( @body ) {

不过,我不认为你应该发出声音文件。

        if ($_ =~ m/[X]/){

这导致如果行包含一个X.因此,一个成功的匹配,它相当于/X/。然而,这不会告诉你,包含的“X”字。对于这一点,你需要决定一个词是什么,在字的级别做你的匹配。

使用这些想法,考虑下面的脚本。我做了什么方面我认为是一个字一个简化的假设。你应该能够在此建,以满足所有的要求:

#!/usr/bin/perl

use strict;
use warnings;

my $filename = "$ENV{TEMP}/test.txt";
open my $input, '<', $filename
    or die "Cannot open '$filename' for reading: $!";

my $count;

while ( my $line = <$input> ) {
    my @words = grep { /X/ } split /\b/, $line;
    $count += @words;
    print join(', ', @words), "\n";
}

print "$count\n";

__END__

<强>更新如果您不关心发现有一个或多个X字符的每一行内的话,while循环将被简化:

while ( <$input> ) { 
    $count += (my @matches = /(X)/g );
    print if @matches;
}

通过使用$ _。然而,这可能是低效的(因为我们要保存每一个匹配X形)。在这种情况下,tr效果最好:

my ($count, $n);
$n = tr/X// and $count += $n and print while <$input>;

其他提示

您在您如果从句的两个分支打印$_。摆脱else分支的。

在您的问题假定 “串” 等于 “行”:

use strict;
use warnings;

@ARGV=qw(/home/user/Desktop/infile.phy);

my $count = 0;
open my $outfile, '>', 'outfile' or die $!;
while (<>) {
  my $cnt = tr/X/X/;
  if ($cnt) {
    print;
    print $outfile $_;
  }
  $count += $cnt;
}

close $outfile or die $!;

print $count;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top