![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
再びお世話になります。
perl5.14の環境でログ表示のみのスクリプトを作っています。
4<>一平<>記事<>オヤ<><><>
3<>次郎<>記事<>おや<><><>
1<>太郎<>記事<><><><>
1<>次郎<>記事<><><><>
2<>花子<>記事<><><><>
2<>太郎<>記事<>親<><><>
1<>太郎<>記事<><><><>
1<>花子<>記事<><><><>
1<>太郎<>記事<>oya<><><>
上記のようなログデータから4番目の値がある行だけを取り出したいです。
以下のように書くと一行目のオヤの行だけが取り出されてしまいます。
html側で言うとレス記事の行を非表示にしたいのです。
# ログの表示
foreach $i (@file){
($num,$name,$msg,$oya,$url,$mail) = split(/<>/,$i);
@file = grep /$oya/, @file;
print <<EOM;
$num<br>
$name<br>
$msg<br>
$oya<br>
$url<br>
$mail<br>
---------------<br>
EOM
}
4番目の値の文字列が変ってしまう場合も一緒に取り出すにはどう書けばよいのでしょうか?
よろしくお願いいたします。
No.5
- 回答日時:
ごめん, 言われるまで気づかなったけど「$i に『4番目の値』があったら表示しなかったら表示しない」は俺のミスだ. 本当は
「$i に『4番目の値』があったら表示し, なかったら表示しない」
と書きたかったんだろう, たぶん.
で正解はまさに
「ログ表示部分を
if ($oya ne "") {
}
でくくった」
だ.
ちなみに「ループ中で変更しているので他の処理に影響が出そう」ってのは何を気にしている? #3 では確かに
その中で @file を変更したらまずい
と書いたけど, (grep の行は完全に消しておいて) 上のようにログの表示部分をいじるだけなら @file は変更してないよ.
お世話になっております。
なるほどgrepを使わなければ大丈夫なのですね。
気にしているのは1ページごとの記事表示の切り替えでのことです。
データの量が多い場合のため実際のスクリプトでは1画面に表示する数を指定してフォームボタンで次の画面に飛ぶ処理をしています。
今回のif文でくくるとレス記事は非表示になりますが1画面の数でレス記事分も数えているようです。
1画面3記事を指定すると上のログファイの例では最初の画面で
4
一平
記事
オヤ
---------------
3
次郎
記事
おや
---------------
こう出て、次へのボタンを押すと
2
太郎
記事
親
---------------
となります。
これはレス記事の数も数えているって事ですよね。
つまりレスが3行以上続くと空白ページも出現します。
試行錯誤したのですが$oyaの数だけの数え方がどうにも解りません。
どのようにしたら良いのでしょうか?
またはif文以外で$oyaのみを取り出す方法はありますでしょうか?
よろしくお願いいたします。
No.4
- 回答日時:
もう 1度確認するが
「$i に『4番目の値』があったら表示しなかったら表示しない」
というのはどう書くのかな?
お世話になっております。
色々試してループ中でログ表示部分を
if ($oya ne "") {
}
でくくったら望みの結果が出ましたが何か違う気がします。
これだと言われていたループ中で変更しているので他の処理に影響が出そうです。
「表示しなかったら表示しない」というのは意味が解りません。
私がそのようなおかしな処理をしているのに気付けという事でしょうか?
もちろん間違っているから動かないのですけど何が間違っているのか解っていません(涙)。
よろしくお願いいたします。
No.3
- 回答日時:
まず,
foreach $i (@file)
とループを回しているのだから
その中で @file を変更したらまずい
というイメージは持たないといけない.
その上でだが, 「$i に『4番目の値』があったら表示しなかったら表示しない」というのはどのように書くかな?
foreach $i (@file)以前で処理しておくと言う事でしょうか?
なんとなくおぼろげにそんな気はしていました(汗)。
perlのバージョンが低かった頃は
@file=grep{split /<>/; $_[3]++} @file;
こんなコードをループ前に書くと望みどおりの結果になっていたんですけど5.14では滅茶苦茶な表示になりました。
これは自分では書き方を考えられないのでwebを検索すると「配列からユニークな要素だけを取り出す」というようなgrepを使う情報が沢山ありそれを参考にしていました。
@file=grep{split /<>/; $_[3] ne ""} @file;
これでも動いていたのですが5.14では何もしてくれません。
それで色々と試していたら何も取り出さなくなって、自分ではお手上げで恥ずかしながらこちらに質問しました。
1番目の要素が最後に出現する行だけの検索でも良いのかも知れないとも思うのですがそのような処理の仕方も解りません。
何卒お力をお貸しください。
よろしくお願いいたします。
No.1
- 回答日時:
「4番目の値がある行だけを取り出したい」ってどういうこと? その例だと, どういう結果が欲しいの?
お世話になります。
4
一平
記事
オヤ
---------------
3
次郎
記事
おや
---------------
2
太郎
記事
親
---------------
1
太郎
記事
oya
---------------
こういう結果が欲しいのです。
現状では最初に出現した$oyaの値だけにマッチしてそれ以下の行の値の違う行にはマッチしないようです。
ログファイの例で一行目の$oyaの値が以下の行にある場合はそれにもマッチするようです。
そもそもマッチしていないのか、マッチしているのに取り出し方が悪いのかもよく解っていません(汗)。
@file = grep /$oya/, @file;
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- HTML・CSS HTMLソースの質問 3 2022/07/28 13:29
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- その他(コンピューター・テクノロジー) 正規表現の置換で一部の文字列をそのまま残したい 2 2022/05/03 19:19
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl言語について。
-
テキストファイルで提出とは?
-
Perlのエラーについてご教授く...
-
INDIRECT 横に再度抽出したい
-
perl LWPでURLにアクセスした時...
-
perlのgrepでmyを付けた場合と...
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
Perlで特定文字列から特定文字...
-
perlをバージョンアップしたら...
-
Wallpaper Engineでおすすめの...
-
arduino の割り込み処理について
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
Perlで時間の計算
-
このファイルを開く方法で困っ...
-
TeraPadエディターの操作方法に...
-
cgiでサーバーにファイルを追加...
-
フローチャート 九九
-
LinuxにおいてのPerlのプログラ...
-
perl 初等プログラミングについて
-
Perlのエラーについてご教授く...
-
こんにちは ブラケッツでプログ...
-
bashスクリプト
-
perlプログラミング 空白行削除
おすすめ情報
すみません。
foreach $i (@file){
($num,$name,$msg,$oya,$url,$mail) = split(/<>/,$i);
ではなくて
foreach (@file){
($num,$name,$msg,$oya,$url,$mail) = split(/<>/,@file[$i]);
こうでした。