我应该如何打印出文件中的特定字符读取文件后?
-
13-09-2019 - |
题
我读使用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;
不隶属于 StackOverflow