는 "선"과 동일 . 아마도
#!/usr/bin/perl
또는 which perl
이 시스템에 반환되어야합니다.
use strict;
use warnings;
좋습니다.
open (FILE, "/home/user/Desktop/infile.phy") || die "cant open file\n";
어휘 파일 핸들을 사용할 수있는 경우 패키지 전역 파일 핸들이 필요하지 않습니다. 요즘은 3 인자 형식 인 open
이 바람직합니다. 또한 오류 메시지는 열 수없는 파일을 나타내야합니다.
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) {
그러나 나는 파일을 긁어 모을 필요가 없다고 생각합니다. 라인이 그래서 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 : 하나 개 이상의 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"); 또는 변종 중 하나. –