以下のようにカテゴリーと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
よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
>今回は下記のエラーと…
こちらの環境では問題なく動きますね…。
書き換えたりしませんでした?
whileとかはいらないですよ。
この回答への補足
本日改めてできなかったスクリプトを確認したところ、元のソースのほうは問題なかったのですが、読み込むデータ側に改行コード(\r\n)が入ってしまって、うまく読み込めなかったのが原因だったようです。大変失礼いたしました。
ありがとうございました。
申し訳ありません。家の環境でやってみたところ正常に動作いたしました。。。
なぜ職場でエラーとなったのかについては、来週会社に行って確認するまでわからないのですが、おそらくはshiren2さんの仰るとおり、どこか勝手に書き換えてしまったのだと思います。
いろいろお手数おかけしてしまいましたが、これを機にperlの勉強を頑張りたいと思います。ありがとうございました。
No.3
- 回答日時:
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に入ってしまっているようなのですが、これをうまくそれぞれの配列に入れるには、どのようにすればよいでしょうか。
度々申し訳ありませんが、よろしくお願いします。
No.2
- 回答日時:
$/ = '';
とすれば「空行と空行の間」を 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)
No.1
- 回答日時:
ちょっと呪文じみてますが…。
どうでしょう。
#!/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.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SEO googleサーチコンソールで、重複URLが多数発生、その修正方法について 2 2023/06/23 16:15
- C言語・C++・C# condaコマンドに対応したプロキシ設定が思うようにならないようです。 2 2022/04/11 17:15
- その他(IT・Webサービス) MacとWindows Google検索した時のURL表示の違いについて 1 2022/11/17 10:38
- JavaScript ブックマークレットについて 2 2022/10/09 11:48
- その他(プログラミング・Web制作) .htaccessの設定で、httpはhttpsに、且つ、wwwありに統一、の記述方法 2 2023/06/22 10:54
- WordPress(ワードプレス) Wordpressの記事URLを自由に決めたい 3 2022/06/02 12:05
- 数学 数独の解法についてお聞きします 4 2023/05/25 17:15
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- PHP 画像ファイルの名前をそのままURLにする 3 2022/10/16 11:18
- その他(IT・Webサービス) GoogleサイトによるHP作成後、皆さんへの通知方法 1 2023/04/04 21:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
csvで順番の入れ替え
-
Perlでのforeach文の挙動がわか...
-
window.open でのファイル指定方法
-
VBAでCSVファイルの特定行を書...
-
ReadLineでの読み出し行を指定する
-
awkスクリプトでダブルクォーテ...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
htaccessで特定のディレクトリ...
-
fopenでディレクトリ内の全ファ...
-
ファイル出力の改行コードをLFに
-
エクセルVBAで素数だけを出力す...
-
fgets で値が取得できない
-
エクセルVBA コードが同じでも...
-
DOSコマンドで、標準出力を出力...
-
MATLABのm-fileについて
-
openした後、closeしないでプロ...
-
Perlで特定行から特定行までを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どのようなプログラムをつくれ...
-
csvで順番の入れ替え
-
perlでの三次元配列の作り方
-
配列の中に重複文字列があるか...
-
要素を削除する最適な方法
-
perlで複数行のデータを自由に...
-
pushをすると行ができる
-
ファイルから読み込んで配列へ
-
Perlの初歩的な質問・・・
-
行・列の整理! perl
-
C言語のバイナリモードでのfsca...
-
perl-cgi 文字の長さでソートし...
-
C言語でバイナリファイルの読み...
-
Pythonの再帰関数の動作の流れ...
-
CSVデータ「","」と「,」混在読...
-
perlで読み込んだURLを配列に入...
-
perlの無名配列の使い方を教え...
-
ソートのテクニックについて
-
ランダムでかぶらないように4...
-
頻度表の作成(Perl初心者です)
おすすめ情報