重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

タイトルの通りなのですが、1行中の特定の文字の個数を取得し、ある個数の時だけその行を表示させようとしています。例えば特定の文字を":"とし、":"がちょうど5個ある行だけ表示させる場合、splitを使って以下のようなコードを考えましたが、どうもスマートじゃない気がします。しかもこれだと"a:b:c:d:e:"のように、行末が":"になっている場合は、$num=5となってしまい、正しく動作しません。どなたか解決策をお願いいたします。

while(<IN>){
@list = split( /:/ , $_ );
$num = @list;
if( $num == 6 ){
print "$_\n";
}
}

A 回答 (6件)

@tmp = ($_ =~ m/:/);


if (scalar(@tmp) == 6)

でどうでしょう。
    • good
    • 0

#5 のように, tr を使うのが普通だと思います.


・tr は「変換した文字の個数」を返す
・tr で後ろが空の場合は前と同じものを指定したとみなす (つまり実質的に変換しない)
ですから.
あ, 今は「: が 5個」だから tr/:// == 5 です.
    • good
    • 0

# No.4さんのバリエーションですが・・



while(<IN>){
print if tr/:// == 6;
}
    • good
    • 0

while(<>){


print if(scalar(my @tmp = m/:/g) == 5);
}
    • good
    • 0

こんにちは



name.cgi(データファイル)に以下のようにデータが入ってるとして

a:b
a:b:
a:b:c:d:
a:b:c:d:e
a:b:c:d:e:
a:b:c:d:e:f

こんな風にしてみました

open(IN,"./name.cgi");
@log=<IN>;
close(IN);

# データ数取得
@n=split(/\n/,@log);
$n=@n;

foreach(@log) {
for(1..$n){

# 行末に『:』があるか調べる
$word="$log[$j]";
if($word !~ /:$/) {

# 行末に『:』がないもので『:』の個数を調べる
@num=split(/:/,"$log[$j]");
$num=@num;

# 書き出し処理
if($num eq "5"){
print "一致するもの:$log[$j]<br>\n";
}else{
print "一致したけど:$log[$j]<br>\n";
}

}else{
print "一致しないもの:$log[$j]<br>\n";
}
$j++;
}
}

表示結果は

一致したけど:a:b
一致しないもの:a:b:
一致しないもの:a:b:c:d:
一致するもの:a:b:c:d:e
一致しないもの:a:b:c:d:e:
一致したけど:a:b:c:d:e:f

となって『a:b:c:d:e』だけ取得できました(^^)
    • good
    • 0

タイトルの通り?


取得したいのは、特定の文字ではなく、
特定の文字で区切られたデータではないですか。

簡単な方法かどうか、正規表現で思うとおり指定するのはどうです。

D:\>C2.pl
NG: 1:2:3:4:5:
OK: 1:2:3:4:5:6

#!Perl
use strict;
for ('1:2:3:4:5:', '1:2:3:4:5:6') {
 if (m|^([^:]+:){5}[^:]+$|) {
  print "OK: $_\n";
 } else {
  print "NG: $_\n";
 }
}
__END__
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!