を、のは、一つ一つを手放す:ラインをシェバング
#!/use/bin/perl
は、最も可能性が高いタイプミスです。おそらく
#!/usr/bin/perl
またはwhich perl
がシステムに返されます。
use strict;
use warnings;
良い。
open (FILE, "/home/user/Desktop/infile.phy") || die "cant open file\n";
字句ファイルハンドルを使用できる場合、グローバルファイルハンドルをパッケージにする必要はありません。最近では、3引数形式のopen
が望ましい。また、エラーメッセージには、開くことができなかったファイルを示す必要があります。
ファイルを配列にスラッシングしています。この場合、これはまったく必要ありません。
my $count = 0;
my $string = '';
最小限の可能な範囲内の変数を宣言して(必要に応じて)初期化します(必要な場合)。
my $count;
変数$string
は、コード内の他の場所では使用されません。
foreach $_(@body){
これは愚かです。ループ変数が指定されていない場合、for
は$ _を使用します。字句ループ変数を指定すると、そのままの状態に保つ方が簡単です。
for my $line (@body) {
しかし、私はあなたがファイルを嫌うとは思わない。ラインだからX.が含まれている場合は成功した試合になり
if ($_ =~ m/[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__
UPDATE:使用すると、1つのまたは複数の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>;
この課題はありますか? –
私も同じことを考えていましたが、導入テキストのサンプルの問題と同じように簡単に問題になる可能性があります。 – inkedmn
ある時点で、「別のファイル」を開いてそのファイルに書き込む必要があります。また、その形式の「公開」を使用しないようにしてください。通常の$変数で使用するためにファイルハンドルを返すフォームを使用します:open($ fh、 "filename");または変形の1つ。 –