皆さんのお知恵をお貸し頂ければ幸いです。

Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。

example.log
==================================
aaaa
hogehoge
test
okok
perl
script
==================================

上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。
イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。

それでは、どうぞよろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。



それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $flag = 0 }
  elsif ($flag) { print "$data\n" }
}
close FH;

で、もっと略したいPerlな人だとこんな感じ。Perl独特の記法がふんだんに使われているので、勉強するには不向きかもしれませんが^^;

open FH, "example.log" or die $!;
while (<FH>) {
  print if /^hogehoge$/ .. /^perl$/ and !/^(?:hogehoge|perl)$/;
}
close FH;

※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。
    • good
    • 0
この回答へのお礼

こちらもありがとうございます。
両方の方法で目的通りの動きをすることが確認出来ました。
ただ、後の方の構文はNo2さんが教えて下さったのと同様に、勉強不足の為なぜ動くのかがわかっていない次第です^^;

お礼日時:2005/06/18 20:28

#Perlな人は .. 演算子を使ってこう書くかも知れません


while (<IN>){
if ($_ eq "hogehoge\n" .. $_ eq "perl\n"){
print;
}
}


#目的の位置まで読み飛ばして、目的の最後のキーワードが
#見つかり次第ループを抜けるならこう書くこともできます
1 while <IN> eq "hogehoge\n";
while(<IN>){
print;
$_ eq "perl\n" and last;
}


#もっとデータが大量にある場合に高速で抜き出すには
#read関数を使って書くこともできますが、複雑なので
#割愛します。
    • good
    • 0
この回答へのお礼

お世話になります。
こちらの内容でもいけるようです。
ただ、構文が理解出来ていない為、なぜ動くのがわからないのが難点です^^;;
ともあれ、ありがとうございました。

お礼日時:2005/06/18 20:25

Perlな人はもっと略したいでしょうけど素直に書けば。



$flag=0;
open(FH, "< ./example.log");
while($data = <FH>){
  print "$data\n" if $flag==1;
  chomp $data;
  $flag=1 if $data eq "hogehoge";
  $flag=0 if $data eq "perl";
}
close FH;

参考URL:http://www.rfs.jp/sitebuilder/perl/
    • good
    • 0
この回答へのお礼

ありがとうございました。
ご教授頂いた内容を少し弄りましたが、目的を達することが出来ました。

お礼日時:2005/06/18 20:23

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q行と列を入れ替えた式

行と列を入れ替えた式

A=(a b c d)とします。この行列の行と列を入れ替えた行列は(a c b d)らしいんですが、行と列を入れ替えるという意味がよくわかりません
僕は、1行目と1列目を換えて、2行目と2列目を換えると考えました。しかし、その場合は(a b c d)で元に戻ってしまします。
何故、僕の考えでは行と列を入れ替えた行列にならないんでしょうか??

誰か、うまく教えらる人 アドバイスおねがいします

Aベストアンサー

こんばんわ。

行列で「行と列を入れ替える」というのは、
「対角線に沿って線対称に入れ替える」ことになります。
ですので、対角線上(左上から右下)の成分は変わりません。

2×2行列において
左上を(1, 1)、右上を(1, 2)
左下を(2, 1)、右下を(2, 2)

という座標もどきに表すことにして、行と列の数字を入れ替えることを考えます。
これが「行と列を入れ替える」の本当の意味です。

すると、対角成分は入れ替えても元の場所を指しています。
大学数学ではこれを「転置」と呼びます。

2×2行列では様子がわかりにくいので、3×3行列での転置の様子を合わせて添付しておきます。

Qperlからのexcel読み込み

お世話になります。

win7
ActivePerl 5.16.3
Apache HTTP Server 2.0

perlからエクセルファイルを読み込むプログラムを作成しています。

----
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';
Win32::OLE->Option(Warn => 3);

eval{
Win32::OLE->GetActiveObject('Excel.Application');
};
if($@){
die "Excelが使用できません。$@";
}

unless (defined $Excel){
$Excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
or die "Excelが起動できません。";
}

my $Book = $Excel->Workbooks->Open("Excelファイルのフルパス")
or die Win32::OLE->LastError();
$Book->Close;
$Excel->Quit();
----

現在は単純に、開いて、閉じるだけの状態です。
ワークシートが1つのエクセルファイルは問題ないのですが、
2つ以上ワークシートがあるエクセルファイルを開くと、$Book->Closeのところで戻ってこなくなります。(ブラウザで待機中の状態)
該当のエクセルファイルは、開いた状態です(直接エクセルで開いてみると編集のためロックされていますと出る)ので、Openは出来ているような気がします。
$Book->Closeを書かなければ下に流れていきますが、
プロセスが残ってしまいます。

ワークシートが1つのときと、複数のときで違いがあるのでしょうか?

お世話になります。

win7
ActivePerl 5.16.3
Apache HTTP Server 2.0

perlからエクセルファイルを読み込むプログラムを作成しています。

----
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';
Win32::OLE->Option(Warn => 3);

eval{
Win32::OLE->GetActiveObject('Excel.Application');
};
if($@){
die "Excelが使用できません。$@";
}

unless (defined $Excel){
$Excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
or die "Excelが起動できません。";
}

my $Book = $Excel->Wo...続きを読む

Aベストアンサー

間が空いてしまってすいません
ご質問に開いて閉じると書いてあったので画面上の話かと思いました
ファイルのopen/closeの話だったんですね
失礼いたしました
Webで利用するCSV変換ということで
 Excel2003までなら「Spreadsheet::ParseExcel」
 Excel2007なら「Spreadsheet::XLSX」
をcpanからダウンロードして利用するとよいと思います
とくに前者はサンプルが充実していて大変参考になります
後者も使い方がシンプルでCPANのサイトの紹介コードで充分理解できます
どちらもPurePerlなので、サーバのPerlモジュールとしてビルド・インストールしなくても「use lib」で簡単に扱えるのが特徴です
数年前に実際に使ったことがありますが、シートが複数でも問題無かったうえにレンタルサーバ上でも動作しました

Qエクセルの行と列を入れ替える。

エクセルで、数式を残したまま行と列を入れ替えることはできますか?
行と列を入れ替えると、#REFが出てしまうのですが。

Aベストアンサー

こういうのはどうですか。
例 データ 
Sheet1のA1:C3
143
254
397
A3,B3,C3には
=SUM(A1:A2)のような合計関数が入っていますが、回答には関係ない。
Sheet2 に行って
A1に
=OFFSET(Sheet1!$A$1,COLUMN()-1,ROW()-1)
と入れてA1の式をA3まで複写。
A1:A3を範囲指定し、+ハンドルを出して、C1:C3まで引っ張る。
結果 Sheet2の A1:C3
123
459
347
値だけ並べ替えている。
Sheet1の変動の結果は即時反映します。

QPerlでテキストファイルの読み込み

Perl初心者ですがよろしくお願いします。

テキストファイルのデータを読み込んで簡単な計算がしたいのですが、うまくいきません。

data.txt
-----------------------------------
年月    固定電話  携帯電話
18年3月  10,000   15,000
18年2月  12,000   14,000
18年1月  11,000   13,000
17年12月  9,000   15,000
17年11月  9,500   14,000
#(同様に続く)
-----------------------------------

特定の月(例えば17年12月)から過去1年分の固定電話・携帯電話の個別合計とその総計。また、月ごとの合計を出したいのですが、どのようにすればよいでしょうか?ご教授願います。m(_ _)m

Aベストアンサー

問題解決済みと思いますが・・・

入力画面から年月を入れて、エクセルで計算結果を表示するプログラムを書いてみました。

#2さんの回答を参考に全角スペースのまま処理できるようになっています。

Windows でしか動きません・・・

参考URL:http://perllearner.web.fc2.com/denwa.htm

Qエクセルデータの列と行を入れ替える方法をご存知の方、教えて下さい。

エクセルデータの列と行を入れ替える方法をご存知の方、教えて下さい。
今、A列(1行目から1,000行目位まで)に日付、B~F列にそれぞれ数値のデータを入れていますが、それを1行目に日付、2~6行目に数値のデータと言うように、いわゆるタテとヨコを入れ替えたいのですが、何か良い方法は無いでしょうか。
1,000日分位のデータがあるため、手で打ち換えるのもちょっと・・・
データは日付列が1列、データ列が5列、数値のみで数式などは入っていませんし、セル結合もしていません。単純に6列×1,000行位のエクセルデータです。
また、入れ替えるのでなく別のシートに入力し直す方法でも、同じシートの未使用スペースにコピーアンドペーストする方法でも構いませんし、(エクセルが何列使えるか知りませんが)1,000列使えないようなら幾つかに分割しても構いません。
ご存知の方がおられましたらよろしくお願いします!

Aベストアンサー

Excel2003の最大列数は、2^8=256 で、2007は 2^14=16,384 ですので、
お使いのバージョンによって、適宜行数を変更する必要がありますが、・・・
下記のような操作で、行と列を変更することができます。
  
1) 入れ替えるセル範囲を選択して「コピー」します。
2) 新しいSheetを開いて、右クリックから「形式を選択して貼り付け」→「行列を入れ替える」にチェックを入れて「OK」を押します。
  
「Excelで表の行と列の入れ替え」
http://shikaku.biglobe.ne.jp/pc_technic/excel/03_1.html
  
下記URLのページのような方法もあります。
  
「行と列を入れ替えたい時は(行列を入れ替える)」
http://blog.goo.ne.jp/office2007/e/4bd8aef879c510d0c9dea43cf75433e0

Qperlでの、ファイル読み込みについて

perlでの、ファイル読み込みについてお尋ねしたいことがあります。

a b c
d e f
g h i

というような内容のテキストファイルがあったとき、この成分を「○行×列」の個別に読み込みたいのですが、
(C言語でいう、「A[0][0]=a A[0」[1]=b A[0][2]=c A[1][0]=d ・・・のように)

どのようにしたらよいのでしょうか?

perlに関しては全くの初心者なのですが、どうしてもperlを使わないといけない事情があり、
稚拙な質問かとは思いますが、どうぞよろしくお願いします。

Aベストアンサー

http://www.ideone.com/LMvNU
一例として。

参考URL:http://www.google.co.jp/search?hl=ja&q=perldsc&lr=lang_ja

QExcel で 行 と 列を入れ替えるには

Excelで 行 列 を入れ替えるにはどの様にすればいいでしょうか?
 10行 10列 の行列を順番も換えず入れ替えたのですが
どの様にすればいいのでしょうか?
 よろしくお願いします。

Aベストアンサー

入れ替えたい範囲を選択して"コピー"
"形式を選択して張り付け"で「行列を入れ替える」にチェックをつけて"OK"
で出来ます。

QPerlからSSLのページを読み込みたい

ここのページを参考にuse Socketでホームページを読み込むスクリプトを作りました。
http://ash.jp/perl/socket_http.htm

httpは問題なく読み込めるのですが、httpsのページが読み込めません。

以下のように'http'を'https'に変更してみたのですが、エラーになります。
$port = getservbyname('https', 'tcp');

■エラー
Your browser sent a request that this server could not understand.
Reason: You're speaking plain HTTP to an SSL-enabled server port.
Instead use the HTTPS scheme to access this URL, please.
----

use Socketではsslのページを読めないのでしょうか?
Perlでsslのページを読む方法はありますでしょうか?

Aベストアンサー

「perl ssl」で検索すると…
http://netandfield.com/~shinoda/tech/0068_ssleay_install.html
とか見つかりますが、SSLeayモジュールは入っていますか?

QExcel の行と列の入れ替え

Mac 版のExcel (2008) について質問です。
旧バージョンでは行と列の入れ替えは「形式を選択してペースト」をすれば出来たのですが、2008 のバージョンではそれが出来なくなっています。
このExcel 2008 での行と列の入れ替えをする方法を教えてください。

Aベストアンサー

>何回か試してみましたが、その都度「行列を入れ替える」のチェックボックスの有るぱねると、無いパネルが出ることがあります。

それはオブジェクトペーストの形式を問うパネルではないでしょうか?直前にExcelのセルをコピーしなければ、そちらの形式のパネルが出てきてしまいます。Excelのセルをコピーした後「形式を選択してペースト」を選べば必ず「行列を入れ替える」が選択できると思うのですが、確認お願いします。

Q[perl5.8] SJISから読み込んだ~と

sjisで書かれたファイルsjis.txtに"~"と一文字だけ
書いて、それをutf8で記述した以下のperlスクリプト
で読込み、文字列マッチングをしたのですが、うまく
いきません。(ちなみにソース中blockB部分を有効に
し、blockAをコメントアウトするとうまくいきます)

#=== match.pl ===============================
#!/usr/bin/perl

use encoding 'utf8';
use open IN => ":encoding(Shift_JIS)";
use open OUT => ":encoding(utf8)";
binmode STDOUT, ":raw:encoding(shiftjis)";

# === blockA ===
open(IN, "<sjis.txt");
@lines = <IN>;
close(IN);
# ==============

# === blockB ===
# $a = "~";
# push(@lines, $a);
# ==============

for(@lines) {
 if (/~/) {
  print "WAVEDASH発見\n";
 }
}
#=============================================

※いわゆるWAVEDASH問題に起因してそうだな、
 というのはわかりますが、具体的に何が起きて
 いるのかが理解できません。

原因や、どうすればこの問題を解決できるか、
ご存知の方、お知恵をお貸しください。

sjisで書かれたファイルsjis.txtに"~"と一文字だけ
書いて、それをutf8で記述した以下のperlスクリプト
で読込み、文字列マッチングをしたのですが、うまく
いきません。(ちなみにソース中blockB部分を有効に
し、blockAをコメントアウトするとうまくいきます)

#=== match.pl ===============================
#!/usr/bin/perl

use encoding 'utf8';
use open IN => ":encoding(Shift_JIS)";
use open OUT => ":encoding(utf8)";
binmode STDOUT, ":raw:encoding(shiftjis)";

# === blockA ===
...続きを読む

Aベストアンサー

過去の質問にも、いくつかこの問題についてでていますが、
要点としては、
Unicodeの~(FF5E)は、シフトJIS~(8160)のマッピングに無くて
シフトJIS~(8160)にマッピングされているのは、
Unicodeの〜(301C)の方だということです。
なので、マッチングをみるだけなら
〜(301C)の方を使えば良いです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報