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

以下のようにカテゴリーとURLが書いてあるファイルがあり
これをPerlでカテゴリとURLに分けて処理したいと思っております。
例えば配列としてカテゴリとURLを自由に呼び出せるよう
にしたいのですが、あまりに初心者で方法が思いつきません。。。

テキスト
-------------------------------------
Search Engine
http://www.yahoo.co.jp
http://www.google.co.jp

Shopping
http://www.rakuten.co.jp
http://amazon.co.jp

Sports
http://www.mlb.com
http://www.j-league.or.jp

その後多数のカテゴリとURLが続く。。。
-------------------------------------

どんな方法でもカテゴリと関連したURLが取り出せればよいのですが、
例えば下記のような配列や、
$shopping[1] = http://amazon.co.jp

あるいは下記のような多重配列にしてURLを扱うにはどのようにしたらよいでしょうか?
$url[0][1] = http://www.google.co.jp

よろしくお願いいたします。

A 回答 (4件)

>今回は下記のエラーと…


こちらの環境では問題なく動きますね…。
書き換えたりしませんでした?
whileとかはいらないですよ。

この回答への補足

本日改めてできなかったスクリプトを確認したところ、元のソースのほうは問題なかったのですが、読み込むデータ側に改行コード(\r\n)が入ってしまって、うまく読み込めなかったのが原因だったようです。大変失礼いたしました。
ありがとうございました。

補足日時:2011/02/14 12:17
    • good
    • 0
この回答へのお礼

申し訳ありません。家の環境でやってみたところ正常に動作いたしました。。。
なぜ職場でエラーとなったのかについては、来週会社に行って確認するまでわからないのですが、おそらくはshiren2さんの仰るとおり、どこか勝手に書き換えてしまったのだと思います。

いろいろお手数おかけしてしまいましたが、これを機にperlの勉強を頑張りたいと思います。ありがとうございました。

お礼日時:2011/02/10 22:25

ANO.1です。


openでファイルハンドルを開いて、DATAの代わりに使えば動くと思います。

#!/usr/bin/perl
use strict;

open(IN, "data.txt") or die;
my $data = join("", <IN>);
my @data = map{ [ split /\n/ ] } split(/\n\n/, $data);

my @search = @{$data[0]};
my @shopping = @{$data[1]};
my @sports = @{$data[2]};

この回答への補足

ご返信ありがとうございます。
同様に試してみたのですが、今回は下記のエラーとなってしまいました。
Can't use an undefined value as an ARRAY reference at ./3.pl line 9, <IN> line 11.

printf("%s\n", $search[5]);を使ってhttp://www.rakuten.co.jpが出力されたことから、全ての文字が@searchに入ってしまっているようなのですが、これをうまくそれぞれの配列に入れるには、どのようにすればよいでしょうか。
度々申し訳ありませんが、よろしくお願いします。

補足日時:2011/02/10 18:02
    • good
    • 0

$/ = '';


とすれば「空行と空行の間」を 1つの単位として読み取れるので

$/ = '';
while ($block = <>) {
chomp $block;
my ($category, @data) = split /\n/, $block;
$url{$category} = \@data;
}
という感じもあるかな. この場合はハッシュ %url でアクセスすることになりますが.

この回答への補足

ご返信ありがとうございました!大変勉強になります!

ただ、教えていただいた通りにやってみたのですがうまくいかず、ハッシュの要素を見るため以下の部分を追加したら、下記のような結果となりました。使い方が間違っているのでしょうか。どのようにすればうまく結果が取り出せるのでしょうか。
根本的にperlの理解が乏しくて申し訳ないのですが、よろしくお願いします。

foreach $key ( keys( %url ) ) {
print "key : $key\n";
print "value : $url{$key}\n"
}

<出力結果>
key : Search Engine
value : ARRAY(0x80c760c)

補足日時:2011/02/10 12:11
    • good
    • 0

ちょっと呪文じみてますが…。


どうでしょう。


#!/usr/bin/perl
use strict;

my $data = join("", <DATA>);
my @data = map{ [ split /\n/ ] } split(/\n\n/, $data);

my @search = @{$data[0]};
my @shopping = @{$data[1]};
my @sports = @{$data[2]};

# Search Engine
printf("%s\n", $search[0]);

# http://www.yahoo.co.jp
printf("%s\n", $search[1]);

# http://www.google.co.jp
printf("%s\n", $search[2]);

__DATA__
Search Engine
http://www.yahoo.co.jp
http://www.google.co.jp

Shopping
http://www.rakuten.co.jp
http://amazon.co.jp

Sports
http://www.mlb.com
http://www.j-league.or.jp

この回答への補足

ご返信ありがとうございました!大変勉強になります。

素人の私には完全に呪文ですね。。(^^;)
教えていただいた形でやってみたところ、値を取り出すことができたのですが、_DATA_部分がファイルのため、それを引数にして処理したいと考え、見よう見真似で、下記のようにしたのですが、どうもうまくいきません。。。
おそれいりますが、どのようにすればうまく出力できるか教えていただけないでしょうか。

#!/usr/bin/perl
use strict;

my @search = ();
my @shopping = ();
my @sports = ();

while (my $data = join("", <>)) {
my @data = map{ [ split /\n/ ] } split(/\n\n/, $data);

@search = @{$data[0]};
@shopping = @{$data[1]};
@sports = @{$data[2]};

}

# Search Engine
printf("%s\n", $search[0]);

# http://www.yahoo.co.jp
printf("%s\n", $search[1]);

# http://www.google.co.jp
printf("%s\n", $search[2]);

<出力結果>
Can't use an undefined value as an ARRAY reference at ./11.pl line 12, <> line 11.

補足日時:2011/02/10 12:08
    • good
    • 0

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