トップページ⇒php
1001コメント356KB

Perlコーディング初心者質問スレ Part 53

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0708nobodyさん2007/01/09(火) 12:40:14ID:???
パスワードがわからない時は該当IDのメールアドレスに
パスワード送信できるようにすれば
0709nobodyさん2007/01/09(火) 13:09:11ID:???
>>702
>>697
>・・・大体、半角カタカナを使って書く言葉って、あまりいい意味の言葉じゃないですよね。

はい、いい意味じゃない言葉。
m9(^Д^)プギャー ( ´_ゝ`)フーン ( ゚д゚)、ペッ( ゚Д゚)ヴォケ!!
('A`)マンドクセ ( ´,_ゝ`)プッ
顔文字だけでこれだけありますね。
顔文字だけならДゝあたりをNGにすればいいですが、顔文字なしで
使う場合もある。
NGワードに半角カタカナを指定すると誤爆しまくるのでダメ。
#ギあたりでひっかかる
0710nobodyさん2007/01/09(火) 13:12:47ID:???
ところでjcode.plのマニュアルってなんで英語なんだ。
日本人だよね?作ったのって。

;#$jcode'h2zf{'xxx'}
;#These are pointer to the corresponding function just
;#as $jcode'convf.

これなんかどういう意味?どういう使い方するわけ?
訳はできても使い道がわからないんだが。
0711nobodyさん2007/01/09(火) 13:20:54ID:???
見たまんまだし、日本語マニュアルあるし、今時jcode.plを使うのもどうかと
0712nobodyさん2007/01/09(火) 15:28:47ID:???
>>711
まだまだJcodeが使えなかったり、Perlのバージョンが古いままの鯖はたくさんある。
0713nobodyさん2007/01/09(火) 16:27:08ID:???
ttp://www.itmedia.co.jp/help/tips/linux/l0149.html
ここの内容をコマンドライン上ではなく、
perlスクリプト内でしたいのですが、
どうやってやればよいでしょうか?
ご教授お願いします。

PHPは結構かじりましたが、perlは全く0です。
正規表現もそれほど自信がないです・・・・ orz
0714nobodyさん2007/01/09(火) 16:39:09ID:???
>>713
-i相当のことをやるのはめんどくさいので、system使えばいいんじゃない?
0715nobodyさん2007/01/09(火) 17:01:19ID:???
>>713
単に「perlスクリプト内でしたいの」であれば1行毎に
$var =~ s/¥r¥n/¥n/;
をすれば良いのだが、>>714が読み取ったように、
「ファイルの読み書きやらデータのIOをどう処理したら良いか」
ということを聞きたいのか?
0716nobodyさん2007/01/09(火) 17:07:56ID:???
>>713
要はWindowsの改行コードをUNIXのものに変えたいということじゃないの?
$textに問題の文字列が入っているとしよう。
$text =~ s/\r\n/\n/g; # Perl
これで$text内の全ての\r\nが\nに変換される。
これはPHPでいう以下のいずれかの構文と同じ処理になる。
$text = preg_replace("/\r\n/", "\n", $text); // PHP: 意味合いとしてはこっちがより正確だが
$text = str_replace("\r\n", "\n", $text); // PHP: PHPではこっちがより推奨される

問題がWindowsとUNIXだけなのであれば、単純に\rを排除するだけでも良い。
$text =~ s/\r//g; # Perl
これはPHPでいう以下のいずれかと同じ処理。
$text = preg_replace("/\r/", "", $text); // PHP: 意味合いとしてはこっちがより正確だが
$text = str_replace("\r", "", $text); // PHP: PHPではこっちがより推奨される

が、これにMacが絡むと改行コードは\rだけだったりすることもありうるわけで、
単純に\rを排除していてはMacでは改行が全て消えて無くなってしまう。
より汎用性を求めるなら以下のようにすべきだろうね。
$text =~ s/\r\n/\n/g; # Perl1: Win -> UNIX
$text =~ s/\r/\n/g; # Perl2: Mac -> UNIX
これはPHPでいう(以下略
$text = preg_replace(array("/\r\n/", "/\r/"), "\n", $text); // PHP: 意味合いとしてはこっちがより正確だが
$text = str_replace(array("\r\n", "\r"), "\n", $text); // PHP: PHPではこっちがより推奨される
もしくは
$text =~ s/\r\n|\r/\n/g; # Perl: 上の1と2をまとめたもの
これはP(ry
$text = preg_replace("/\r\n|\r/", "\n", $text); // PHP: 配列を使わない場合
0717nobodyさん2007/01/09(火) 17:12:28ID:???
>>713
以下を hoge.pl で保存
=======
#!/usr/bin/env perl -i.old -p
s/\r\n/\n/ ;
=======
$ perl hoge.pl hoge
じゃダメか?w
しかしソース元の -npe ってなんだかなあ
=====
#!/usr/bin/env perl
for my $name ( @ARGV ){
open IN, $name or die ;
my $data = do { local $/ ; <IN> } ;
close IN ;
rename $name , $name . '.old' ;
$data =〜 s/\r\n/\n/g ;
open OUT, '>' . $name ;
print OUT $data ;
close OUT ;
}
=====
0718nobodyさん2007/01/09(火) 17:13:48ID:???
しまった、サファリでカキコしてしもうた。全角バックスラッシュは
単なるバックスラッシュに脳内置換よろ
0719nobodyさん2007/01/09(火) 17:21:51ID:???
>>714-715
レスありがとうございます。

perlのスクリプトをちょっと改造したい
(ある変数内のデータから^Mを削除したい)のですが、
systemとかを使うと、ほかの部分も弄る必要性が出てきそうで、
現時点の自分のperl能力からはできれば避けたいと考えてます。

PHPなら下みたいな感じでよい気がするのですが、
同じことをperlではどうすればいいでしょうか。
perlは変数宣言とかが厳しいと聞いたことがありますが、
ほかはphpと似たようなものでしょうか?

$file_array = file( $file_path );
for($i=0; $i<count($file_array); $i++){
$file_array[$i] =~ s/\r\n/\n/;
}
$file_data = implode("\n", $file_array);
0720nobodyさん2007/01/09(火) 17:31:31ID:???
そのプログラム、ある変数から\rを削除してるだけには見えないのだが。

$file_pathに格納されたパスにあるファイルを開いて読み出し、
各行の\rを削り、さらに各行をさらにもうひとつの\nをはさんで
つなげているような。

そもそもPHPとかperl以前に、自分が何をやりたいのか、何をやろうと
しているのかを的確に理解して説明する能力を身につけるべきな気が
するぞ。
0721nobodyさん2007/01/09(火) 17:33:08ID:???
>>720
713 見てからレスれよ
0722nobodyさん2007/01/09(火) 17:38:59ID:???
>>718
rep2マジお勧め。

>>719
その構文だと各行の間が"2つの"\nで連結されてしまうけどそれでいいのかな?

open(FILE, $file_path);
@file_array = <FILE>;
close(FILE);
for (my $i = 0; $i < @file_array; $i ++) {
$file_array[$i] =~ s/\r\n/\n/;
}
$file_data = join("\n", @file_array);

>>721
おまいも>>719見てからレスれw
0723nobodyさん2007/01/09(火) 17:49:05ID:???
ただいまより、語尾にレスれとつけるスレとなりました。
ネスレじゃありませんよレスれ
0724nobodyさん2007/01/09(火) 17:51:22ID:???
半角カナはマルチなんだな。
スルーで。
0725nobodyさん2007/01/09(火) 18:12:19ID:???
くっそー移転してるの気づかなかった
0726nobodyさん2007/01/09(火) 18:27:32ID:???
>>712
軽く確認してみただけけれども、ファイルコピーだけで5.005でもJcode動いてるような。
5.005よりも古い鯖って見たこと無いのだけれどそんなにあるんですか?
0727nobodyさん2007/01/09(火) 18:51:04ID:???
aaacafeは5.005
http://fh.aaacafe.ne.jp/cgiperl.html

iswebは5.6
http://help.www.infoseek.co.jp/isweb/?id=20601

Jcode.pmは度忘れしたけど、CGI.pmも入ってないとこがあったはず。
上の2つは古きよきなんとやら。
すでに引越ししてるだろうけど。
0728nobodyさん2007/01/09(火) 18:51:43ID:???
直リンしてもた、吊ってくる
07296502007/01/09(火) 20:30:53ID:???
>>654
アドバイスありがとうございます。
>>660
やはりそれが原因でしたエスケープで解消しました。
>>664
CGIでCGIファイルを書き出す必要性が頭悪すぎてよくわかりませんorz...
ですがいずれそういう必要性が無いとも限らないので作ってみようと・・・

たとえばホームページを春には桜吹雪の演出、夏は魚が泳ぎ、秋には紅葉が降り、
冬には雪が降るような演出をするとします。
このページそのものがHTMLでは作れそうに無いのでHTMLではなくCGIの
ファイルだとします。
そのページを季節に合わせるためFTPを使わずに更新するには更新用のCGIの
ページからCGIのファイルを更新すれば出来るみたいなー感じでいいのかなと。
でも、もっと簡単な方法がありそうですね。
0730nobodyさん2007/01/09(火) 20:49:40ID:???
>>729
もしかしてJavaScriptとCGIの違い分かってないのでは?
0731nobodyさん2007/01/09(火) 22:47:00ID:???
むかし、覚えた手の頃だったか。
処理速度あっぷのためにif分などの分岐をなくそうとcgiからcgiを書き出してたなぁ・・・。
今ならテンプレートを読み替えるだけで済むなぁ。
0732nobodyさん2007/01/09(火) 23:05:36ID:???
>>650の人は難しく考えすぎというか、なんというか。

当然、各季節用の js なり背景なりを用意しておいて、CGIの中に書かれた
CSS部分を書き換えて背景変えたり、script type="text/javascript" src="ここ" を書き換えて
呼び出す js を変えたり…という動作をするCGIは作れる。
CGIからHTMLを書き換えたり、別のCGIを書き換えたり、いろいろできることはできる。
やることは「テキストファイルを読んで内容を変更して書き出す」だけですから。

適当に「設定ファイル」を作ってそれを差し替えるだけで済むようにすればCGIを組むより楽ですよ。
「季節が変わる毎」程度だったら、もっとも簡単かもしれないのがローカルで書き換えてFTP(ry

でも、勉強のためにローカル環境でこういうのを作って遊んでみたくなったんだったら、
是非遊んでみるべきだと思う。
0733nobodyさん2007/01/09(火) 23:13:11ID:???
てか季節によってわけたいだけなら、JavaScriptだけでいいじゃん
0734nobodyさん2007/01/09(火) 23:32:53ID:???
>>729
>CGIでCGIファイルを書き出す必要性が頭悪すぎてよくわかりません

それはこちらのセリフなのだがw

第三者にやれと言われてやってるなら仕方ないが、自分で思い付いてやってるとしたら、
他にもっと勉強した方が良いと思うぞ。
リファレンスとかオブジェクト指向とかな。
0735nobodyさん2007/01/10(水) 01:36:37ID:???
>>729
cgiも所詮はただのファイルなのでパーミッションだけ注意すれば普通に作れる。
0736nobodyさん2007/01/10(水) 02:02:13ID:???
>>726
tuf8に変換する、utf8から変換するのが必要な場合は
ソースをちょっと書き換えないとだめよん。
0737nobodyさん2007/01/10(水) 02:08:30ID:???
>>735
物理的にファイルを生成するという意味ではそのとおり。

論理的なプログラグを生成する難易度はまた別だけどな。
0738nobodyさん2007/01/10(水) 10:52:10ID:???
HTML表示プログラムで分岐すればいいだけでは?
あるいは設定ファイルのようなものを外部で持っておいて
その設定ファイルを書き換えるとか。
0739nobodyさん2007/01/10(水) 15:22:36ID:???
>>727
モジュールがまったくない鯖があったはず
ぷららだったっけ?nifty?忘れた
0740nobodyさん2007/01/10(水) 16:08:45ID:???
便利なものは上手く使うとして、
仕組みを学び知ることは大事だよね
0741nobodyさん2007/01/11(木) 02:30:38ID:???
>>739
Niftyは確かに strict.pm も入れてないほどきれいさっぱりモジュールがない。
0742nobodyさん2007/01/11(木) 05:11:48ID:???
最近Perl/CGIを始めた者ですが、お聞きたいことがあります。

ifを使って、特定の条件を満たさないと隠しページへ行けない様にしたい
のですが、どういう関数を使えば良いかさっぱりわかりません。例えば、
あるページ上でテキストボックスに1と入力したら隠しページへ移動する
といった感じにしたいのですが、Basic認証のプログラムなどを参考にし
てみましたが、意味がわからず挫折しました。

隠しページはcgiファイルにして、直接URLを打ち込んでも閲覧できないよ
うにし、特定の条件をクリアした場合のみ閲覧できるようにしたいのです。
もちろんパーミッションは644にします。url_jump_toで最初試したのです
が、案の定駄目でした。

どなたか、条件をクリアしたらcgiファイル(パーミッション644)を閲覧
できる方法をよろしければ教えてください。房ですみません。
0743nobodyさん2007/01/11(木) 07:13:27ID:???
拡張子が.plのスプリクトの動かし方を教えてください!!!
ActivePerlをインストールしたのですが、そこからどすればいいのか分かりません・・
.plファイルをダブルクリックしてもコマンドラインが一瞬でて消えるだけです・・
どなたか教えてください!!!
0744nobodyさん2007/01/11(木) 07:52:48ID:???
プログラムが終了すればプロセスも終了する
DOS窓を開いて
> perl /path/to/hoge.pl
みたいに実行させたり hoge.pl が終了する部分に `pause` を書くとか。。
0745nobodyさん2007/01/11(木) 07:57:07ID:???
コマンドプロンプトの設定で閉じないようにできなかったっけ?
0746nobodyさん2007/01/11(木) 10:36:19ID:???
>>742
644は実行権限が無いから、プログラムとしては動かない
とはいえ拡張子がcgiだとhttp経由ではプログラムとしてしか見れないようになってるはず
つまり644で閲覧は現実的じゃない(できないことは無いだろうけど)

それよりもif文で分岐して2つのファイルのどちらかを読み込んで表示すればいいんじゃね?
0747nobodyさん2007/01/11(木) 12:13:26ID:???
PPM3 なんですが、Time::HiRes が search で見つからない orz
以前は PPM 経由でインストールできてたのにこんなことってあるんですね・・・
0748nobodyさん2007/01/11(木) 13:04:09ID:???
VC Express Edition じゃコンパイルでエラー … windows.h がパッケージに含まれてないとか .net つかえねぇ orz
0749nobodyさん2007/01/11(木) 13:04:29ID:???
>>747
あったとしても最新バージョンでないことも多いからね
0750nobodyさん2007/01/11(木) 13:13:49ID:???
>>748
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/
0751nobodyさん2007/01/11(木) 13:14:15ID:???
>>747
リポジトリを追加
0752nobodyさん2007/01/11(木) 13:20:57ID:???
>>747
ppm3はモジュール名じゃなくてディストリ名で検索しないといけなかったような
つまりTime-HiResで
0753nobodyさん2007/01/11(木) 13:28:22ID:???
いつからかは知らんが少なくともperl-5.8.8ではTime::HiResは本体と一緒に
配布されてるので、いちいち別にとってきてインスコする必要はなくなった。
0754nobodyさん2007/01/11(木) 13:29:22ID:???
>750
ありあと・・・でも >751 さんの方法で見つかった m(_ _)m
0755nobodyさん2007/01/11(木) 14:23:06ID:???
>>746
ありがとうございます。
ファイルを読み込ますのですか...
requireを使用するんですかね?
0756nobodyさん2007/01/11(木) 14:54:00ID:???
>>755
いや、openとprintとcloseを使う。
必用であればforeachも使う。
0757nobodyさん2007/01/11(木) 14:56:34ID:???
まぁrequireでもいいけどね
0758nobodyさん2007/01/11(木) 15:08:39ID:???
foreachよりもwhileだね。
0759nobodyさん2007/01/11(木) 15:23:52ID:???
>>756-758
ありがとうございます!
ちょっと試してみますね。
0760nobodyさん2007/01/11(木) 15:27:03ID:???
759です。
少し疑問があるのですが、これってURLを直接打ち込まれたら
第三者に覗かれる恐れがありますよね?
0761nobodyさん2007/01/11(木) 15:28:49ID:???
なんのURL?
0762nobodyさん2007/01/11(木) 15:30:33ID:???
データファイルの URL じゃない?
データファイルは HTTP で見れる範囲より外に置くか、ランダムな文字列で生成された16文字ほどのディレクトリに置けばいい
でなきゃ DB にぶち込むとか・・・
0763nobodyさん2007/01/11(木) 15:32:42ID:???
それこそ拡張子cgiで644にして置いておけば?
0764nobodyさん2007/01/11(木) 15:36:39ID:???
>>761
説明不足でした。条件を満たしたら隠しページのファイルを読み取るよう
にしたかったのですが、隠したいページのURLを直接入力されたら終わり
だなあと思いまして。

>>762
HTTPで見れる範囲外ですか...なるほど。ちょっと調べてみます。
ランダムなディレクトリはrand関数でなんとかなりそうですが、
僕の知識ではまだまだできそうにありませんorz

>>763
cgiを644にするとファイルが読み取れなくなってしまうので
どうしたもんかと途方にくれています。

みなさんありがとうございます。
0765nobodyさん2007/01/11(木) 15:40:13ID:???
>>764
644のcgiファイルをopenで読み込んでみ
まぁまず本の一冊でも読み込んでみ
0766nobodyさん2007/01/11(木) 15:54:09ID:???
>>764
>隠したいページのURLを直接入力
よくわからんけど・・・
つ basic認証
0767nobodyさん2007/01/11(木) 15:57:25ID:???
http鯖とかcgiのしくみをてんで理解してなさそうだから
ここでちょこちょこやりとりするだけじゃ面倒みきれない
ような気がする
0768nobodyさん2007/01/11(木) 16:03:19ID:???
764です。
openで読み込みましたが、やはりうまくいきませんでした。
急遽、CGIとPerlでシステムを作るよう頼まれたのですが
おっしゃる通り、まだまだ無知なことも多いので1週間くらい
死ぬ気で勉強してみます。
色々聞けてよかったです。ありがとうございました。
0769nobodyさん2007/01/11(木) 16:03:57ID:???
なので、一旦出直しますノシ
0770nobodyさん2007/01/11(木) 19:01:52ID:???
>CGIとPerlでシステムを作る

はぁ・・・
0771nobodyさん2007/01/11(木) 19:48:29ID:???
>>770
まあ初心者はPerl/CGIをよくわかってないからな,
偉そうに言ってる俺もいまいちよくわかってないけど.
ここは初心者スレだけど,やっぱりできる人間が多いの?
0772nobodyさん2007/01/11(木) 20:31:25ID:apL14Vu+
なんか噛み合ってなさそw
742がふぁびょりすぎて噛みあってないんだと思うぞw
Basic認証は、利用できるように設定がなっているなら
.htaccess
.passwd
の2ファイル作って
.htaccessを認証させたいディレクトリに置き、.passwdのある場所を指定する。
.passwdを適切な場所におく。レンサバだと.passwdを置く領域確保されてないっしょ?
/home/[account]/ とか用意してくれている鯖ならいいんだけどね
0773nobodyさん2007/01/11(木) 20:40:24ID:???
.htaccessへのアクセスが拒否されるサーバ(Apacheのデフォルト)は、
たいてい.ht*のファイルすべてがアクセスを拒否されるから、.passwdも
.htpasswdにしておいた方が安心だな。
0774nobodyさん2007/01/11(木) 23:45:41ID:???
すまん,
770は何がおかしいのかわからんのだが.
CGIとPerlって部分か?
0775nobodyさん2007/01/11(木) 23:51:59ID:???
それ俺も気になった
0776nobodyさん2007/01/11(木) 23:56:09ID:???
>774
770は言葉の意味と用途が違うと言いたいんだろうけど、
ここは初心者質問スレだからな。
「断熱とベニヤ板で家を作る」と言ってる感じか?

そんなの、「ベニヤ板で断熱しつつ家を作る」と
置換・理解できない770がDQNなだけ。ほっとけ。
0777nobodyさん2007/01/12(金) 01:19:27ID:???
問題は特にないけど
CGIの中身をPerlで書きますよって意味なら問題ない。
>CGIとPerlでシステムを作る
って書き方だと
CGIからシステムコールでplなファイルを叩くイメージっぽい気もするかも
でも770の突っ込み自体おかしい。そこは素通りしとけw
0778nobodyさん2007/01/12(金) 04:21:38ID:???
プログラム板から誘導されて来ました。
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz

CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。

具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。

渡されてきたURLを「http://www.xxx.com/index.php?%A5%AC%A5」のように、
そのまま表示するにはどうしたらいいでしょうか?

一応書いておくと、スクリプトはUTF-8Nで書いています。
0779nobodyさん2007/01/12(金) 10:37:26ID:???
上と下との違いがわからんのだが。
0780nobodyさん2007/01/12(金) 11:03:38ID:???
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5

とリンクに書いたのなら%A5などのURIエンコードされた部分が
デコードされてくるのは当たり前だろう。

http://www.xxx.com/index.php?%A5%AC%A5

というURIをuriという名前のパラメタで渡したいのなら本来は、

xxx.cgi?url=http://www.xxx.com/index.php?%25A5%25AC%25A5

とすべきなのでは?

0781nobodyさん2007/01/12(金) 11:13:04ID:???
じゃなきゃ表示時にもう一回urlエンコードすりゃいいだけの話
0782nobodyさん2007/01/12(金) 11:20:56ID:???
今回の例はたまたまどっちでもいいが、渡したいURIが

http://www.example.com/hoge.cgi?a=xxx&b=yyy

みたいなものもありうるとするならば、渡す前の方で
適切にエンコードしておかないとだめですな。
0783nobodyさん2007/01/12(金) 13:48:13ID:???
みなさんレスありがとうございます。
なるほど…最初のリンクを生成する時点で%を%25にエンコードしておく必要があるんですね。

>じゃなきゃ表示時にもう一回urlエンコードすりゃいいだけの話

>http://www.example.com/hoge.cgi?a=xxx&b=yyy
>みたいなものもありうるとするならば、渡す前の方で適切にエンコードしておかないとだめですな。

urlパラメータに入るURLは、一般的なURLか前述したような文字コードを含んだURLが大半を占めるのですが、
ユーザー投稿式なので、何が来るかわからないという点を考えると、
最初のリンク生成の時点で適切なURLエンコードをしておいた方がいいようですね。

教えていただいた事を踏まえて、最初のリンク生成時に%を%25にエンコードする様スクリプトを組んだ所上手く動きました。
皆さんありがとうございます。
しかし、この方法だとhoge.cgi?a=xxx&b=yyyのようなものが来た時にダメとの事なので、
もう少し適切に処理させたいと思うのですが、またまた上手くいきません。
というか、どういう風に処理したらいいか分からないという感じです。

$elem =~ s/(https?:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\$]*)/<a href=\"$script?url=$1\">LINKはこちら<\/a>/go;
$elem =~ s/\%/\%25/go;

1行目は日本語混じりの文章($elem)の中にURLが張られた場合、それを「LINKはこちら」というリンクに置換させています。
そして、2行目で%→%25にしているわけですが、これだと当然問題が。

・本文中の文章の中にURL以外の%があっても置換してしまう。
・&などが来るとダメ?

「%だけじゃなくてちゃんと全部エンコードすればいいじゃないか」 とは思うのですが、
本文中から(https?:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\$]*)にマッチする文字列だけをエンコードさせる方法がわかりません。
どのようにしたらいいでしょうか?
本文中にはURLが複数箇所張られる可能性も考慮したいです。
度々の質問失礼しますが、ご教授の程よろしくお願いします。
0784nobodyさん2007/01/12(金) 13:56:34ID:aFkw6ayO
ヒアドキュメントの書き方で質問です。
ヒアドキュメントを使わない時に以下のように書けるコードは
どのように書けばいいでしょうか。

print NEW "mydoc = \"@document\";\n";

これでは出力されるファイルの方には@documentという文字が出る。"をエスケープでも同様
print <<"EOM";
mydoc = "@document";
EOM

これではmydoc = "@documentの中身";という形にならない。
print <<"EOM";
mydoc = @document;
EOM
0785nobodyさん2007/01/12(金) 13:58:42ID:???
>>783
use URI::Escape;

$本文 =~ s/(その正規表現)/uri_escape($1)/ge;

てな感じでいいはず
0786nobodyさん2007/01/12(金) 14:06:42ID:???
>>784
前者の書き方でいいはずだが。試すときになんか勘違いしてない?

% cat a.pl
@document = qw(unko chinko);

print "mydoc = \"@document\";\n";

print <<"EOM";
mydoc = "@document";
EOM

% perl a.pl
mydoc = "unko chinko";
mydoc = "unko chinko";
0787nobodyさん2007/01/12(金) 14:13:10ID:???
分からなければ連結すりゃいいんじゃ

'mydoc = "' .@document. '";' ."\n";
07887842007/01/12(金) 14:26:05ID:???
>>786
まさに勘違いしていたようです(滝汗)
前者であってました。すみません。ありがとうございます。

>>787
さんくすです。
0789nobodyさん2007/01/12(金) 15:27:30ID:???
>>785
おぉおおお! できました!
ありがとうございます!
こんな一行で出来る事だったんですね。

これで目的のスクリプトが組みあがりそうです。
2度の長文質問に答えてくださった方々、本当にありがとうございました。
0790nobodyさん2007/01/13(土) 00:05:27ID:???
744さんの書いている事がよく分かりません・・
拡張子が.plのスプリクトの動かし方を教えてください!!!
ActivePerlをインストールしたのですが、そこからどすればいいのか分かりません・・
.plファイルをダブルクリックしてもコマンドラインが一瞬でて消えるだけです・・
通常のアプリのように直感的に扱いたいです。コマンドライン?から起動とかじゃなくて

あと一つ質問です。
拡張子が.plのファイルの拡張子を無理やり.cgiに変更した場合、cgiとして正しく動作しますか? サーバーレンタルしたらそこで使えますか?

perlに詳しい方、厨房にも分かるように教えてください!!!
どうかお願いいたします。
07917902007/01/13(土) 00:13:42ID:???
ちょっと間違って書いた所がありました。
ActivePerl-5.8.8.819をインストールしてから.plをクリックしたら、
D:Perl\bin\perl.exeとなってコマンドラインがでてきました。
コマンドラインは消えませんが、ここからどうすればいいのか・・・・
助けてください
0792nobodyさん2007/01/13(土) 00:17:33ID:???
それで正常に動いています。プログラムの使い方は作者に聞くなり、説明書を読むなりしましょう。
ここは「プログラムを作る人」の為の板でありスレッドです。使う側の質問は板違いです。
0793nobodyさん2007/01/13(土) 00:20:49ID:???
UNIXでperl動かすのとwinで動かすのはどんな違いがあるんですかね?
UNIX鯖レンタルしてそこで動かそうと思うですが、何をインストールすればよいのでしょうか?
0794nobodyさん2007/01/13(土) 00:31:51ID:???
>>791
本屋さんで立ち読みでもいいから、入門書のアタマをちょっと読んだ方がいいよ。
0795nobodyさん2007/01/13(土) 21:51:44ID:wEKIwJY9
キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、
C言語でいうところの、getch() に相当する関数はないでしょうか?
0796 ◆TWARamEjuA 2007/01/13(土) 21:57:49ID:????BRZ(6701)
>>795
WebProg板って事なので、CGI経由になるのかしら?
それならJavaScriptを使った方がよさげの悪寒♪
07977952007/01/13(土) 22:06:58ID:???
>>796
いえ、シェル上でのperlスクリプトです。
07987952007/01/13(土) 22:08:17ID:???
すいません、プログラム板の方がふさわしそうなので、
そっちへ移動します。
0799nobodyさん2007/01/14(日) 22:03:27ID:7dLarnkv
OUTER: foreach my $tmp (@tmp_data){
  foreach my $key (keys %target){
    my $value= $target{$key};
    if($key == 1){ next OUTER }
    else{ next OUTER; }
  }
}


上記と下記は同じ流れ方をすると思っていたのですが、下記のwhileの場合、
どうも%targetを最上層のforeachから再度読み出すとハッシュのはじめから
よんでいないような挙動を見せます。
こちら何かアドバイス等ございます際にはいただけますと幸いです。


OUTER: foreach my $tmp (@tmp_data){
  # my %target = %common::target; を入れて初期化すると上記同様の流れになる
  while(my ($key, $value) = each(%target)){
    if($key == 1){ next OUTER }
    else{ next OUTER; }
  }
}
0800nobodyさん2007/01/14(日) 22:11:17ID:???
each の場合は、イテレータのポインタがリセットされないって事では
0801nobodyさん2007/01/14(日) 22:17:51ID:???
>>800
早速のご返答有難うございます。

そうだとは思うのですが、これに関する説明がググってもどうも
出てこなかったため、質問させていただきました。

ちなみに、PHPの場合では以下がございました。
おそらくこういうことかとは思いますが。。
ttp://asakura.g.hatena.ne.jp/asakura-t/20051116/1132113906
0802nobodyさん2007/01/14(日) 22:27:08ID:???
perldoc -f each
したら書いてあったけど。ググるだけじゃなくて、マニュアルも読もう

There is a single iterator
for each hash, shared by all "each", "keys", and "values" func tion calls
in the program; it can be reset by reading all the
elements from the hash, or by evaluating "keys HASH" or "values HASH".
0803nobodyさん2007/01/15(月) 05:27:53ID:???
既存のコードを改造しようとコードを見たら、
$::FLAG{'cache'}
というのがあったんですけど、
この時の「$」はいったいなんでしょうか?
0804nobodyさん2007/01/15(月) 08:15:52ID:???
スカラー
0805nobodyさん2007/01/15(月) 13:31:24ID:???
最近なんか初心者質問スレっぽくない感じがする
俺的には高度な話題が多くなったなぁ、みんな凄いわ
0806nobodyさん2007/01/15(月) 20:35:55ID:???
>>809
:: はパッケージを指定する為の演算子です。
$Pkg::var のように書くと Pkg パッケージのパッケージ変数 $var を参照できるのですが
パッケージ名を省略すると、デフォルトのパッケージである「main」を指定した事になります。


our $hoge = "In main"; # ← main パッケージの $hoge

package Sandbox;
our $hoge = "In sandbox"; # ← Sandbox パッケージの $hoge

print $hoge, "\n";
print $::hoge, "\n";
print $Sandbox::hoge, "\n";
print $main::hoge, "\n";
0807nobodyさん2007/01/16(火) 10:45:24ID:Vliwd/jI
モジュールを探しています。
秒数を日付にするのはありますが、
秒数が何時間とか、何日分に当たるのかとかいった変換を行うものはありますか?
3600S→1Hのようなかんじで。
■ このスレッドは過去ログ倉庫に格納されています