プロが教えるわが家の防犯対策術!

------------------------------------ c:\work\a.bat
c:
cd \work
convert.pl sample.html
convert.pl sample1.html
convert.pl sample2.html


------------------------------------- c:\work\convert.pl
$infile=$ARGV[0];
$outfile=$ARGV[0];
# 変換後ファイルは、拡張子をtxtにして区別
$outfile=~ s/\.html/\.txt/;

# ファイルを開く
open( IN, $infile );
@xx = <IN>;
close(IN);

# 抽出行の先頭行番号を取得
$i=0;
for (@xx) {
if ($xx[$i]= ~ /Array/){
$start = $i;
last;
}
$i++;
}

# 抽出行の最後行番号を取得
for ($j = $start; $j <= 100; $j++) {
if ($xx[$j]= ~ /\)\;/){
$end = $i;
last;
}
$j++;
}

# 書き込み用にファイルを開く
open( OUT, "> $outfile" );

for ($k = $start; $k <= $end; $k++) {
print(OUT $xx[$k]);
}
# ファイルを閉じる
close( OUT );

------------------------------------- c:\work\sample.html
<html>
<head>
<script type="text/JavaScript">
<!--
sample();
var a = new Array("ああああ",
"いいいい",
"うううう");
var b = new Array("ええええ",
"おおおお",
"おおおお");
function init(){
}
--></script>
</head>
<body onload="init();">
</body>
</html>

------------------------------
というようにファイルを作り、a.batを実行すると、
htmlファイルのvar aに該当する行(sample.htmlの場合、6~8行目)だけ
取り出して別ファイルに吐き出すようなプログラムを作ってみたのですが、
うまく動きません。
なお、単純にforeach文で@xxをoutfileに出力するのはできました。
部分だけ取り出そうとすると失敗しました。

どこを直せばいいのでしょうか?

A 回答 (2件)

なんかややこしいスクリプトなんで、読み間違ってたら申し訳ないんだけど、


最初に現れたArrayからその後の最初に現れた);までの範囲を
切り出したいと言う話なら、

#!/usr/bin/perl
# -*- coding: utf8 -*
use strict;
use warnings;
use Fatal qw(:void open close);
use feature ':5.10';


while (<>) {
my $cond = /Array/../\);/;
print if ($cond);
last if $cond =~ /E0$/;
}


こんなんとか。
Arrayと);に挟まれた部分全部という話なら

while (<>) {
print if /Array/ .. /\);/;
}

で。
ファイル名の付け替えとかその辺は面倒なので省略。
    • good
    • 0
この回答へのお礼

無事、別ファイル出力までできました。ありがとうございました。

お礼日時:2008/05/29 17:27

こんにちは。



# 抽出行の最後行番号を取得
for ($j = $start; $j <= 100; $j++) {
if ($xx[$j]= ~ /\)\;/){
$end = $i;
……

この「$end = $i;」、正しくは
----------------------------
「$end = $j;」
----------------------------
ではないでしょうか。

この回答への補足

すみません、おっしゃるとおりです。間違ってました。
直してみたのですが、動きませんでした。

補足日時:2008/05/29 16:38
    • good
    • 0

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