- ベストアンサー
PerlでURLを配列に読み込む方法
- Perlを使用して、カテゴリとURLが書かれたファイルからURLを配列に読み込む方法を説明します。
- 初心者にも分かりやすい方法で、カテゴリと関連するURLを取得して配列で扱えるようにします。
- 便利な多重配列を使用することで、URLをカテゴリごとに管理できます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>今回は下記のエラーと… こちらの環境では問題なく動きますね…。 書き換えたりしませんでした? whileとかはいらないですよ。
その他の回答 (3)
- shiren2
- ベストアンサー率47% (139/295)
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に入ってしまっているようなのですが、これをうまくそれぞれの配列に入れるには、どのようにすればよいでしょうか。 度々申し訳ありませんが、よろしくお願いします。
- Tacosan
- ベストアンサー率23% (3656/15482)
$/ = ''; とすれば「空行と空行の間」を 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)
- shiren2
- ベストアンサー率47% (139/295)
ちょっと呪文じみてますが…。 どうでしょう。 #!/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.
お礼
申し訳ありません。家の環境でやってみたところ正常に動作いたしました。。。 なぜ職場でエラーとなったのかについては、来週会社に行って確認するまでわからないのですが、おそらくはshiren2さんの仰るとおり、どこか勝手に書き換えてしまったのだと思います。 いろいろお手数おかけしてしまいましたが、これを機にperlの勉強を頑張りたいと思います。ありがとうございました。
補足
本日改めてできなかったスクリプトを確認したところ、元のソースのほうは問題なかったのですが、読み込むデータ側に改行コード(\r\n)が入ってしまって、うまく読み込めなかったのが原因だったようです。大変失礼いたしました。 ありがとうございました。