• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perl ファイル内文字列抽出)

perlファイル内文字列抽出方法とimgファイル名の抽出・出力方法

このQ&Aのポイント
  • perlを使用して、ファイル内の特定の文字列を抽出する方法を教えてください。具体的には、htmlファイル内のimgタグのsrc属性にあるファイル名を抽出したいです。抽出したファイル名は、img.txtファイルに出力します。
  • 質問内容として、以下の2つの内容をまとめさせていただきました。 (1) htmlファイル内のimgタグのsrc属性にあるファイル名を抽出する方法 (2) 抽出したファイル名をimg.txtファイルに出力する方法
  • ご質問内容は、perlを使用してhtmlファイル内のimgタグのsrc属性にあるファイル名を抽出し、それをimg.txtファイルに出力する方法です。具体的な手順をお教えします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

ちと気になった点を突っ込ませてくださいな>#4. my $html = join("", <IN>); よりは $/ = undef; my $html = <IN>; の方がよいかと. あと, printf(OUT "%s\n", join("\n", @src)); は $" = "\n"; print OUT "@src\n"; にした方がシンプルじゃないかな. あと open は (それなら) 3引数にするとか, そもそもリダイレクト (とコマンドライン引数) にまかせた方が簡単とかありますけどね.

beishan
質問者

お礼

ご回答ありがとうございました。 頂いた内容で推進させて頂きたいと思います。

その他の回答 (4)

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.4

こんな感じですかね。 コードを見比べてみてください。 インデントは全角スペースになっています。 #!/usr/bin/perl use strict; open(IN, "001.html") or die "ファイルが開けない"; open(OUT, "> img.txt") or die "ファイルが開けない"; my $html = join("", <IN>); my @src = ($html =~ /<img[^>]+src="(.+?)"/g); @src = &uniq(@src); printf(OUT "%s\n", join("\n", @src)); sub uniq {  my %h;  return grep{   if(not defined $h{$_}){    $h{$_} = 1;    1;   }  } @_; }

beishan
質問者

お礼

ご回答頂きまして誠にありがとうございました。 皆さまから教えて頂いた案を参考した上、何とかクリアできました。 今後ともよろしくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「部分しか抽出できなかった」「上手くいけなかった」と書かれていますが, これでは何がどう「部分しか抽出できなかった」「上手くいけなかった」のかが分かりません. ・どのような入力に対して ・どのような結果を期待して ・(その期待に反し) 実際の結果はどうであったのか をきちんと書いてください. 前半は「少なくとも方針はあっている」と思います. 後ろの方は何を表示させたいのかわかりませんが.

beishan
質問者

お礼

度々お手数おかけしまして申し訳ございませんでした。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「やり方が分からなくて」ということだから「やり方」だけ: 1. ファイルを読み込む. $/ を undef にしてから読み込むとファイル全体を一気に読み込めて楽 (だけどメモリが足りなくなったら知らない). 2. その中から img タグを取り出す. 正規表現を使うのが自然か. 3. さらに「イメージファイル名」を取り出す. ここもやっぱり正規表現を使うところだろう. 4. 必要な「イメージファイル名」を出力. ちなみに重複したものを 1つにまとめるのはハッシュを使うのがセオリー.

beishan
質問者

お礼

目的はっきり言わなくて申し訳ございませんでした

beishan
質問者

補足

ご回答ありがとうございました。 以下のように抽出だけできるかどうかを書いてみました use strict; my $temp=""; while(<>){ my $line=$_; if($line=~/<img src="(.*?)" \/>/){ my $img=$1; $temp .= "$img\n"; } } print $temp; 部分しか抽出できなかったのはどこか間違っているでしょうか? また重複を避けるperlも書いてみましたが上手くいけなかった use strict; my $Key=""; my %Buf=(); while(<>){ my $line=$_; # キーが含まれている行なら if ( $line =~ /<img src="(.*?)">$/ ) { $Key = $1; if ( defined( $Buf{ $Key } ) ) { next; } print $line; $Buf{ $Key }++; } else { print $line; } }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

(1) 「このなかの<img src="aaa" \/>イメージファイル名を抽出したいです」とはどういうことでしょうか? 特に「イメージファイル名」が何 (どこ) を意味するのか分かりません. あと, / の前に変なものが入ってるんだけどそれも本当にあるの? (2) 「img.txtファイルで出力」とは? 「img.txt ファイル『に』出力」ですか?

beishan
質問者

お礼

ご回答ありがとうございます。 >(1) 「このなかの<img src="aaa" \/>イメージファイル名を抽出したいです」とはどういうことでしょうか? 特に「イメージファイル名」が何 (どこ) を意味するのか分かりません. あと, / の前に変なものが入ってるんだけどそれも本当にあるの? <img src="aaa" \/>⇒<img src="aaa" />となります。 作業の目的はhtmlに使われているファイルとイメージフォルダ内ファイルが一致しているかどうかをチェックするため、html内イメージファイルを抽出したいのです。 >(2) 「img.txtファイルで出力」とは? 「img.txt ファイル『に』出力」ですか? 「img.txt ファイル『に』出力」したいです。 下手な日本語で申し訳ございませんでした。 よろしくお願いします。

beishan
質問者

補足

(3)抽出されたイメージファイル名が重複された場合は1つだけ残す。

関連するQ&A