トップページphp
981コメント337KB

くだすれPerl(超初心者用)3

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/03/31(火) 22:20:27ID:???
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。

前スレ
くだすれPerl(超初心者用)2
http://pc11.2ch.net/test/read.cgi/php/1204488452/

関連スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/
Perlコーディング初心者質問スレ Part 59
http://pc11.2ch.net/test/read.cgi/php/1234752149/
【Perl上級者コーナーPart01】
http://pc11.2ch.net/test/read.cgi/php/1024741312/
0095nobodyさん2009/05/22(金) 20:15:00ID:???
>>93
「html 外部ファイル 読み込み」とかでググってみ。オススメしないけど。
0096932009/05/23(土) 00:18:41ID:???
>>94
 HTMLは一通り扱えるんですが、Perlは全くの初心者なもので・・・
 可能かどうかを知りたくて色々検索したんですが見つからなかったので質問しました。
 >>94さんのレスでは<textarea>のタグの性質上、<textarea name="xx">のxxの部分をCGIで出力先と指定する事はできない・・・という意味ですか??
 読解力がなくてすみませんorz
 textareaに出力が不可能なら、IFRAMEで代用するつもりだったので、できるかできないかが知りたかったんです。

Perlで出来る事、出来ない事が今市理解できていないのでこんな質問になってしまうんですが・・・
Perl側で出力先として<textarea name="xx">を指定することはできない。
テキストエリアを表示したい場合はPerl側でテキストエリアを作成、HTMLページに埋め込む・・・という形にしないといけないという感じでしょうか??
(Perl側で作成したtextareaにテキストを追加していく・・・というような方法は散見しましたので)
0097nobodyさん2009/05/23(土) 01:32:13ID:???
入力用ページをHTMLで書くと
<form action="表示用CGI" method="post">
<textarea name="log"></textarea>
<input type="submit">
</form>

表示用CGIではデータを受け取って(URLデコード)表示させる
#!/usr/bin/perl
use CGI qw/:standard/;

printf(<<EOT, entity(param('log')));
Content-type: text/html

<form><textarea>%s</textarea></form>
EOT
sub entity{
$_[0]=~s/</&lt;/g;
$_[0]=~s/>/&gt;/g;
$_[0]=~s/"/&quot;/g;
return $_[0];
}
0098nobodyさん2009/05/23(土) 03:05:32ID:???
>>95
横からの質問なんですが、どうしてオススメしないんでしょう。
今自分のスクリプトで外部HTMLを読み込んで変数部分のみ
データに差し替えて出力というのをやっているので気になります…。
0099nobodyさん2009/05/23(土) 08:49:56ID:???
俺も分からんなぁ
テンプレートエンジン使えってことか?
0100nobodyさん2009/05/23(土) 16:14:56ID:???
外部ってのがサイト外ならわからんでもない
0101nobodyさん2009/05/23(土) 18:51:30ID:mYKiWjxl
質問です

------------
perlの変数を、出力時にjavascriptの引数として設定してます。

>my $bbb = 111;
>$aaa = "<a href='javascript:void(0);' onClick='javascript:hoge(\"a\", $bbb, \"b\");'>";
------------

普通に問題なく動いていたのですが、
上記を下記のように引数を追加して変更したとたん、ブラウザがoperaの場合のみ挙動がおかしくなりました。

>my $bbb = 111;
>$aaa = "<a href='javascript:void(0);' onClick='javascript:hoge(\"a\", $bbb, \"b\", $ENV{tmpint});'>";
-------------

具体的には出力後のhtmlソースが、
 firefox, chrome, IE7の場合は 「<a href='javascript:void(0);' onClick='javascript:hoge("a", 111, "b", 22);'>」
となっているのに対し、
 operaのみ 「<a href='javascript:void(0);' onClick='javascript:hoge("a", 111, "b", );'>」
となっていました。

まずoperaキャッシュが怪しいと思ったのですが、問題ありませんでした。
(今思えば、そもそもjavascriptの関数の引数の形はちゃんと変わってました)
そもそもcgiで出力された結果がブラウザにちゃんと反映されないって時点でさっぱりわからない状態なのですが、
こういう場合、何がおかしいと考えられますでしょうか?
0102nobodyさん2009/05/23(土) 19:19:22ID:???
>>101
自己レス、perlのバグでしたorz
opera用に用意したIDでのみ発生する現象でした。
すみませんでしたorz orz
0103nobodyさん2009/05/23(土) 20:34:51ID:???
perlの、じゃなくてスクリプトの、だよな
0104nobodyさん2009/06/06(土) 17:11:16ID:???
質問です。

正規表現で、ある文字列で括られた文字列を抽出したいのです。
たとえば、

括弧で<括られた>文字列を<抽出>

この文字列から、<>で括られた部分の文字列を収集するために、
正規表現で /<.*>/g とマッチさせようとしたのですが、

マッチする文字列は

"<括られた>文字列を<抽出>"

となり、期待した

"<括られた>", "<抽出>"

となりません。

最短の文字列をマッチさせるにはどうしたらよいのでしょう?
0105nobodyさん2009/06/06(土) 18:05:27ID:???
.*? 「最短マッチ」の質問もいまだに多いな
0106nobodyさん2009/06/08(月) 02:34:51ID:???
思ったけど
/<([^>])/


/<([.*?])>/
ってどっちがよりふさわしいんだろ?
0107nobodyさん2009/06/08(月) 10:24:15ID:???
/<(^ω^)>/セフセフ
0108nobodyさん2009/06/08(月) 12:21:13ID:???
>>106
頭バグってんなorz

/<([^>]*)/

/<(.*?)>/
です
0109nobodyさん2009/06/08(月) 12:36:27ID:???
違いはマッチさせる部分に改行を許可するのが上で、下は許可しないことぐらいだろうな

あと、<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
みたいにタグ中にサブタグを含んでるような場合にはもっと複雑に書かないと対応できない
0110nobodyさん2009/06/08(月) 13:47:40ID:???
サブタグとか悪夢すぎる・・・
0111nobodyさん2009/06/10(水) 22:04:38ID:???
>>108
ものぐさなぼくは
> /<(.*?)>/
を支持する。

/<([^>])>/ よりもタイプ数が少ない。
区切り文字が変更されたときに修正する文字数が一文字少ない。
0112nobodyさん2009/06/10(水) 23:01:32ID:???
ドットを抜きにすればシフトキー押しっぱなしでいいというのもあるよな
0113nobodyさん2009/06/17(水) 13:26:38ID:???
自作のモジュールをテストしようとしています
内部でtime関数を読んでるんですが、外からこれを制御することは可能でしょうか
不可能の場合はどうテストすべきでしょうか
0114nobodyさん2009/06/17(水) 14:08:32ID:???
コンピュータの時刻をBIOSから変更することでできる
0115nobodyさん2009/06/17(水) 14:18:32ID:???
>>114
それはPerlから可能なんでしょうか
とっても危険な香りがしますが…
0116nobodyさん2009/06/17(水) 14:21:36ID:???
>>113
「外からこれを制御すること」がイミフ。テストのために何をしたいのかを具体的に。
0117nobodyさん2009/06/17(水) 14:37:45ID:???
>>116
テスト用のスクリプトからこのモジュールを呼んでちゃんと動くかどうか確認したかったんですが、
モジュール内部でtime関数を使って計算する部分があるためにきちんと統制できないので、
テストスクリプト側に返ってくる値が予測できないのです
なので、time関数が返す値をテストスクリプト側から操作したいのです
0118nobodyさん2009/06/17(水) 14:56:26ID:???
time部分を$ARGV[0]に置き換えて
./command.pl 1010101010
みたいにコマンド実行時にUNIX秒渡せば簡単だと思うけどどういうスクリプト&テスト方法なのかわからん
0119nobodyさん2009/06/17(水) 15:31:12ID:???
>>118
そうですね、一つのテストスクリプトでテストしたいのでそれではちょっと面倒な気がします
実際にどういうことをやろうとしてるのか見てもらったほうが早いかもしれませんね
実際はもっと長いですが、モジュールとスクリプトを簡略化したのはこんな感じです
関数・変数のネーミングが微妙なのは無視して下さい

----- Util.pm -----
package Util.pm
# 何日後かを形式に則って出力
sub makeTimeString {
my $date_diff = shift;
my $now = time();
my @time = localtime($now + $date_diff * 60 * 60 * 24);
my $date = sprintf "%4d/%2d/%2d %2d:%2d:%2d", ($time[5] + 1900, $time[4] + 1, $time[3], $time[2], $time[1], $time[0]);
return $date;
}
1

----- test.pl -----
use Util.pm;
use Test::Simple tests => 1;
#今日の場合
ok makeTimeString(3) eq "2009/06/20 3:28";
0120nobodyさん2009/06/17(水) 17:22:21ID:???
そこまで見せられてるにもかかわらずなにをテストしたいのかよくわからん
組み込み関数の挙動が正しいかどうかを確認したいの?

まず$now + $date_diff * 60 * 60 * 24の値が0〜2147483647までの数値かどうかチェックさえすれば
あとは組み込み関数の挙動だからなぁ。。。
0121nobodyさん2009/06/17(水) 17:52:21ID:???
>>120
いつでも何度でもモジュールがちゃんと思った通りに動くかどうか、間違いがないかどうか確認したいんですよ
これからちょっと関数内部を変更したとしてもこのテストスクリプトを動かすだけで正しい動作かどうかチェックできるようにしたいです
ここではtime関数から返ってくる値が起動ごとに違うのでうまくチェックできないじゃないですか
なのでtime関数から渡される数値を同じになるようにテストスクリプト側で操作したいんです
0122nobodyさん2009/06/17(水) 18:52:14ID:???
それはテストの仕方が間違ってると思うぞ
0123nobodyさん2009/06/17(水) 19:21:36ID:???
>>122
ではどうテストするべきでしょうか?
0124nobodyさん2009/06/17(水) 19:28:00ID:???
>>123
そこで思考停止しちゃうのか・・・なんだかなぁ。

俺だったらmodule内で拾ったepoc値を外部コマンドに投げて比較すればいいかなーとか思ってるけど。
秒単位の精度はいらなそうに見えるし。
0125nobodyさん2009/06/17(水) 19:42:53ID:???
>>124
それも考えましたが、結局同じロジックにしても違うロジックにしても、自動で結果を出すことになるので信頼できないと思いまして
それに処理をしてるうちにtime関数で返ってくる値が変わる可能性がありませんか?
0126nobodyさん2009/06/17(水) 20:33:48ID:???
そこまで組み込み関数が信用ならねーってんなら

my $now = ($test)? 0 : time();

でいいじゃん。
0127nobodyさん2009/06/17(水) 20:43:30ID:???
>>126
組み込み関数自体の信頼性は疑ってないです
ただ、スクリプト側でtimeを呼んだときとモジュール側でtimeを呼んだとき、
処理の時間があるのでどうしてもズレがあるわけじゃないですか
それからモジュール側から返ってきた値をチェックしたいので、
チェックするにはスクリプト側でtimeの値を計算してやらなきゃいけない
ということはスクリプト側の計算ロジックも正しい必要があると思います
でも直感的に6月17日の3日後の日時と比較するのなら正しいかどうかが一目でわかると思いまして
0128nobodyさん2009/06/17(水) 20:46:54ID:???
そもそもmodule側でtime関数呼ぶ必要あるの?
呼び出し元でtime関数使ってるならそのepoc値渡せばいいだけじゃん。
テストも簡単だぜ?
0129nobodyさん2009/06/17(水) 20:54:41ID:???
>>128
それなら確かにズレはなくなりそうですが…
テストの為に関数に風穴開けるのはなんかスマートじゃない気がします
それからテスト側でロジック組む必要がある問題は解決して無くないでしょうか?
0130nobodyさん2009/06/17(水) 21:03:18ID:???
脊髄反射でレスしてないでもっとちゃんと読んでくれないか。
あんた言ってることがめちゃくちゃだ。
0131nobodyさん2009/06/17(水) 21:08:05ID:???
>>129
「6月17日の3日後の日時と比較する」のは「テスト側のロジック」に見えるのだが。

というか>>128で言ってるのは

・普段は外から「timeから取得したepoc値」渡す。
・テスト時は「固定値」を渡す。

って意味だよ?
風穴とかスマートとかいう個人的な感性は知らんけど、timeの返り値を外から固定ってのがスマートとはとても思えない。
0132nobodyさん2009/06/18(木) 05:49:48ID:sDQdBVF1
>>130-131
すみません、勘違いしてました
そうですね、関数の引数を増やせばテストは簡単そうですが…

>>131
できる限り引数を減らしたいんです
モジュール側から見たときに、現在時刻を用いてゴニョゴニョするなら
timeを渡さないほうがすっきりしてると思いませんか?
テストをする場面でスマートであるよりも、実際に使われるモジュール・関数単位でスマートであるべきだと考えてます

これは今回の場面だけでないと思います
例えばDBIのラッパーモジュールを作って、
携帯からの記事投稿とPCからの投稿で異なるデフォルト値を設定したいとします(記事タイトルとか)

このとき、タイムスタンプに常に現在時刻を押すとすると、
記事に関する色んなステータスに加えて時刻までもが引数として渡されることになりますが、
それはモジュールとして完結してるのかという話です
確かにテストのために引数を増やせば楽ができますが、もしテスト側でtimeの値を操作することができるなら、
無駄を出さなくて済みますよね
0133nobodyさん2009/06/18(木) 06:35:23ID:???
テストのためだけに引数を渡せとは言って無いのだが・・・。

>記事に関する色んなステータスに加えて時刻までもが引数として渡されることになりますが、
>それはモジュールとして完結してるのかという話です

それを「完結してない」と思う理由が俺には全くわからない。
「引数以上に無駄を出さず、time関数の返り血を制御する」方法は無いと思うが、
どうもこれ以上やりとりしても信条を曲げるつもりが無い以上ずっと平行線だろう。
ま、がんばってくれ。
0134nobodyさん2009/06/18(木) 06:51:03ID:???
よくいるよねこういう人
考えすぎてかえって遠回りしちゃうタイプw
0135nobodyさん2009/06/18(木) 07:10:19ID:???
考えないヤツはそこで終わりだけどなwww

ちなみにこの問題の解決策はあるよ
関数の引数減らすのも普通の考え方じゃねぇの?
0136nobodyさん2009/06/18(木) 07:37:30ID:???
解決策あるなら答えてやれよw
俺も知りたいw
0137nobodyさん2009/06/18(木) 09:11:41ID:???
モジュールの中にテストフラグセットするメソッド作って
>>126で終了じゃダメなの?
0138nobodyさん2009/06/18(木) 10:41:06ID:???
色々引数は渡せるけど全引数はデフォルト持ってる方がスマートだと思います
0139nobodyさん2009/06/18(木) 11:16:51ID:???
>>138
明らかに無駄だとわかるもんがあるとして、
それを引数として渡すことができるのはいかがなものか
0140nobodyさん2009/06/18(木) 11:21:32ID:???
日本語でおk
0141nobodyさん2009/06/18(木) 11:23:53ID:???
質問者が学習する気無いので、これで終了。
次の質問をどうぞ!
0142nobodyさん2009/06/18(木) 18:11:54ID:???
>>136
オーバーライド

----- test.pl -----
#! /usr/bin/perl

use strict;
use warnings;
use lib './lib';

use Time::Local;
use Test::More tests => 1;
use_ok 'Util';

my $time;
{
package Util;
use subs 'time';

sub time{
# 2009/06/17 03:28:00
return $time;
}
}

# 2009/6/17 03:28:00
$time = timelocal 0, 28, 3, 17, 6 - 1, 2009;
ok Util::makeTimeString(3) eq "2009/06/20 03:28:00", "t_value: ". Util::makeTimeString(3);
# 2009/5/30 01:15:13
$time = timelocal 13, 15, 1, 30, 5 - 1, 2009;
ok Util::makeTimeString(5) eq "2009/06/04 01:15:13", "t_value: ". Util::makeTimeString(5);
0143nobodyさん2009/06/18(木) 18:14:39ID:???
----- Util.pm -----
package Util;

sub makeTimeString {
my $date_diff = shift;
my $now = time();
my @time = localtime($now + $date_diff * 60 * 60 * 24);
my $date = sprintf "%04d/%02d/%02d %02d:%02d:%02d", ($time[5] + 1900, $time[4] + 1, $time[3], $time[2], $time[1], $time[0]);
return $date;
}
1

ちなみに Test::MockTime Time::Fake といったそれ用のモジュールもあります


ごめん答え知ってて聞いてた
0144nobodyさん2009/06/18(木) 20:51:05ID:???
こういうのって、タイムゾーンどうしてます?
1.割り切って日本限定
2.DateTimeを使う
3.Unix限定と割り切ってPOSIXのtzset使う
0145nobodyさん2009/06/18(木) 21:21:59ID:???
もう出てけお前
0146nobodyさん2009/06/18(木) 21:26:04ID:???
>>143
釣れて良かったな。次はム板でやれ。
01471442009/06/18(木) 21:29:00ID:???
初カキコでこれとは……。
0148nobodyさん2009/06/18(木) 21:41:58ID:???
場所が悪いw
0149nobodyさん2009/06/18(木) 21:45:11ID:???
>>147
なんかすまんです
そんでタイムゾーンをどう使ってテストする場合の話ですか?

>>146
本当に聞きたかったのは他人がどういうテストしてるのかなんですよね
この答えであってるのか、もっといい方法があるんじゃないかと
0150nobodyさん2009/06/18(木) 21:49:47ID:???
>>149
答えは十分出たと思うけどね。
どの方法が「良い」かなんて自分にしか決められないしキリがない。
そういう意味ではお前さんの聞き方は卑怯だったよ。あとスレタイ良く読めw
01511442009/06/18(木) 22:19:00ID:???
>>149
ええと、localtime使うと時差が出るじゃないですか。
テストする場所で結果が変わると思うので、
その対処方法を聞きたかったのです。
0152nobodyさん2009/06/18(木) 22:31:44ID:???
$ENV{'TZ'} = "JST-9";
0153nobodyさん2009/06/18(木) 22:59:24ID:???
>>152
Windowsの場合、上手く動かないんです。

use POSIX qw(tzset tzname strftime);


$ENV{TZ} = 'GMT+0';
tzset;


my ($std, $dst) = tzname;

print "$std $dst\n";

print strftime('%Y-%m-%d %H:%M:%S', localtime), "\n";


-- Linux(Debian)
GMT GMT
2009-06-18 13:48:27

-- WindowsXP
東京 (標準時) 東京 (標準時)
2009-06-18 22:46:20

# やっぱりgmtimeに置き換え?
0154nobodyさん2009/06/18(木) 23:10:33ID:???
>>153
それってwindowsではgmtが取得できて無いってだけで、localtimeの動作としては合ってるんじゃないのか?
0155nobodyさん2009/06/19(金) 01:05:31ID:???
>>154
Cでも書いてみたのですが、それはLinuxと同じ動作をしました。
結局、下のようなテストケースでUnix:OK, WIndows:NGなのでどうしましょうということでした。

use Test::More qw(no_plan);

use POSIX qw(tzset);


$ENV{TZ} = 'GMT+0GMT';

tzset;



my $now = localtime(1245338340);

ok($now eq 'Thu Jun 18 16:19:00 2009', $now . ' localtime test');
0156nobodyさん2009/06/19(金) 14:25:45ID:ceoCS57H
http://niconama.ddo.jp/

ダウンロード数をカウントするために、PHPアップローダーからアップロードしたファイルを収納しているディレクトリを
CGIのダウンロードカウンターのほうで読み込んで、アップローダーからファイルにアクセス→リダイレクトして
ダウンロードカウンタのURLに移動してファイルを表示、という事をしているのですが、
ダウンロードカウンタの設定で、画像にアクセスしてもブラウザで開かず、ファイルのダウンロードが開いてしまいます。
何時間もググって調べたのですが、プログラムを全くやった事がないので、結局解決しませんでした。
どうすれば、画像をブラウザで開くように出来るんでしょうか。

http://localhost/uploda/src/nico61.txt
これが使ってるカウンタのスクリプトです。

詳しい方、どこを弄ればいいのか教えて頂けないでしょうか。
宜しくお願いします。
0157nobodyさん2009/06/19(金) 14:30:52ID:???
localhost のロダにあるものを見てくれと言われましても
0158nobodyさん2009/06/19(金) 14:39:19ID:ceoCS57H
http://niconama.ddo.jp/src/nico61.txt
ごめんなさい間違えました。
0159nobodyさん2009/06/19(金) 14:42:27ID:ceoCS57H
http://niconama.ddo.jp/uploda/scr/nico61.txt
度々すいませんこれです。
0160nobodyさん2009/06/19(金) 14:55:44ID:ceoCS57H
http://niconama.ddo.jp/uploda/src/nico61.txt
これです、ほんとすいません。
0161nobodyさん2009/06/19(金) 15:09:27ID:???
あまり関係ないが、hostsファイルに
127.0.0.1 niconama.ddo.jp
と書いておけばいいぞ。
0162nobodyさん2009/06/19(金) 22:11:17ID:???
>>156
スーレーちーがーいー

【 スクリプト改造依頼スレ】(丸投げ) part7再々
http://pc11.2ch.net/test/read.cgi/php/1222645553/
0163nobodyさん2009/06/19(金) 22:19:49ID:???
>>156
それよりもnwhoisの再うp消せよ
0164nobodyさん2009/06/20(土) 11:40:20ID:???
文字の比較についての質問です。
以下のように書くと、「真」が表示されます。

if ("真" eq "真" ){
print "真";
}

しかし、以下のように書くと、「真」は表示されません。

if ("真" =~ /真/ ){
print "真";
}

if ("真" =~ "真" ){
print "真";
}

if ("真" =~ /"真"/ ){
print "真";
}

=~ を使用する場合において、「真」が表示される
ようにするにはどうしたらよろしいのでしょうか。

基本的なことですが、どうしても分からないので
質問させていただきました。よろしくお願い致します。
0165nobodyさん2009/06/20(土) 12:06:50ID:???
/\Q真\E/
CP932でコードを書くのをやめるという選択肢もあります。
01661642009/06/20(土) 13:33:31ID:???
>>165
検索サイトでいろいろなキーワードで検索していたのですが、
なかなか答えとなるものが見つかりませんでした。
回答は非常に助かりました。ありがとうございます。
0167nobodyさん2009/06/20(土) 15:58:40ID:???
>>162
すいません移動します。
0168nobodyさん2009/06/22(月) 03:35:03ID:mckf9gfO
質問させていただきます。

CGIの勉強をしていてCGIの製作を行っているのですが、レスポンスが遅い気がします。
abでベンチを書けてみたのですが、10リクエストの処理に5秒もかかっています。(そんなに重いCGIではないです。

自分のコードの書き方が悪いのか、それともマシンが遅いのか調べたいのですが、abをかけるいいサンプルのようなものは無いでしょうか。
他のマシンでどれくらいのスピードで動いているかなどのサンプルがあるものだとうれしいです。
0169nobodyさん2009/06/22(月) 04:00:45ID:???
>>168
Devel::Profiler
Devel::NYTProf
これで性能分析ができるらしい
ボトルネックあるならこれで分かるだろー
0170nobodyさん2009/06/28(日) 17:18:33ID:I7LpaOR5
日本語の単語を入力させるWebアプリ作っているんだが
Jcode.pmに文字コードを自動認識させようとするとたまに誤変換するんだが
(たとえば「えー」をucs2に変換させようとすると「?????」に化ける)
その辺の認識精度を上げるにはどうすればいいのかな?

WebページはUTF-8で構成しているけど、フォーム入力から飛んでくる
文字コードはブラウザが勝手に決めてしまう、って認識で合ってるよね?
0171nobodyさん2009/06/28(日) 18:06:04ID:???
でんでんつがう
0172nobodyさん2009/06/28(日) 19:37:43ID:???
主要ブラウザの実装では、ページの文字エンコード指定もしくは自動判別したそれに従う。
ページのそれと変えたい場合もしくは、より厳密にしたい場合のために、HTML4ではform属性にaccept-charsetが追加された。ただしIE6は未対応。

このレスはたぶん大体あってる。
0173nobodyさん2009/06/28(日) 22:09:18ID:???
>>170
ブラウザの仕様はどうであれ、どんなコードでも対応できるように作っておくのはとても大切。
hiddenで文字コード判定用の文字列をpostしておくと良い。
0174nobodyさん2009/06/29(月) 01:22:45ID:???
でも無意味な場合もある
0175nobodyさん2009/07/05(日) 01:58:48ID:???
これを実行すると#2の出力が文字化けします。
恐らく GET のパラメータの文字コードが utf-8 でないためだと考えています。
どのようにすれば解決できるでしょうか。

#!/usr/bin/perl
use CGI;

my $cgi = CGI->new();
my $str = $cgi->param("str");

print $cgi->header( -charset => 'UTF-8' );

#1
print $str;
#2
sub {map {print $_, "\n"} split(//,shift) }->($str);
0176nobodyさん2009/07/05(日) 02:10:22ID:???
入力元のページは utf8 か?
そうじゃぁなければ use Encode しれ
0177nobodyさん2009/07/05(日) 09:58:44ID:???
>>176
ありがとう。できた。
0178nobodyさん2009/07/26(日) 00:42:20ID:J3wl39Kv
漏れら極悪非道のageブラザーズ!
今日もネタもないのにageてやるからな!
 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ∧_∧   ∧_∧    age
 (・∀・∩)(∩・∀・)    age
 (つ  丿 (   ⊂) age
  ( ヽノ   ヽ/  )   age
  し(_)   (_)J
0179nobodyさん2009/07/29(水) 22:19:43ID:???
すみません、質問させてください。

CGI(Perl)を使って外部のサイトからHTMLソースを取り込むにはどうしたら良いでしょう?
外部サイトのデータから統計を取って、データとして出力するようなCGIが書高と思ってます。
0180nobodyさん2009/07/29(水) 22:20:40ID:???
連レスすみません
>>179
「CGIが書高」→「CGIを書こう」です。
0181nobodyさん2009/07/29(水) 22:25:45ID:???
LWPでググルといいよ
0182nobodyさん2009/07/29(水) 22:46:06ID:???
> LWPでググルといいよ

知らないなら、「わかりません」って言えよ
0183nobodyさん2009/07/29(水) 22:54:54ID:???
それでは>>182先生、よろしくお願いします。
0184nobodyさん2009/07/29(水) 23:26:28ID:???
>>182
よっ! 待ってました!
01851792009/07/30(木) 01:23:24ID:???
LMPでググったところ、HTTP::Liteというのを見つけたので、それを使用して解決しました。
ありがとうございます。
0186nobodyさん2009/08/04(火) 17:31:46ID:opJYW1lj
わからないのでお願いします。
文字化けする文字をこのように変えたいのですが変換されません。
どのように書けばいいのでしょうか。

$a =~ s//高/g;

よろしくお願いします。
0187nobodyさん2009/08/04(火) 18:22:15ID:???
まず置換対象文字列の文字コードと書いてるコードの文字コードを把握しろ
0188nobodyさん2009/08/04(火) 18:46:13ID:Udgymmfy
>>186
が文字化けするので高に変えたいってこと?
0189nobodyさん2009/08/05(水) 08:42:09ID:57ai1vyR
test
0190nobodyさん2009/08/05(水) 10:00:37ID:2mkcb2/U
>>187
ありがとうございます。

>>188
はい、そのようにしたいと考えております。

187さんのおっしゃる通りに、書いてるコードを確認したところEUCでしたので
sjisに変えてみたところ、うまくできました!
ここ数日、悩んでいたのですっきりしました。
187さん、188さん、ありがとうございました。
0191nobodyさん2009/08/05(水) 20:48:29ID:???
文字列の抽出についての質問です。
任意の文字で囲まれた
文字列をすべて抽出する方法がわかりません。

たとえば、abcabcabcといった文字列に対し
aとcで囲まれたすべての文字列を取得するには
どうすればいいのでしょうか?

この例だと
abc
abcabc
abcabcabc
abcabc
abc
が該当します。これらをすべて抽出したいのですが。
0192nobodyさん2009/08/05(水) 21:27:00ID:???
my $str = 'abcabcabc';
while($str =~ m/(a)/g){
my $pos = pos($str);
my $result = $1;
while($str =~ m/([^c]*c)/g){
$result .= $1;
print "$result\n";
}
pos($str) = $pos;
}
01931912009/08/06(木) 09:27:03ID:???
返事が遅くなってすみません。
>>192さん ありがとうございました。
思っていたように動作しました。

続けての質問で申し訳ないのですが
アルファベットで構成されるランダムな文字列
CFGTARFEQZCAZVHNNNGZYAKLOPYL..(みたいな感じです)
から例えば、Aから始まり X,Y,Zを中に含まず XまたはYまたはZで終わる
文字列をすべて抽出するには
どのようにすればよいのでしょうか?

実際には単一のアルファベットの連続ではなく
ONETWOTHREEFOURFIVE..のように
単語が適当に連続しているものと想定して使用できる記述を
(ONEで始まりSIXを含まずTENで終わり のように)
提案していただけると助かります。

よろしくお願いします。
01941912009/08/06(木) 09:38:23ID:???
すみません、上の質問に対する追加です。
単語はONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TENが想定される
のように、あらかじめ分かっていて指定することができます。
■ このスレッドは過去ログ倉庫に格納されています