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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/01/18(水) 02:17:46ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0219nobodyさん2006/01/26(木) 11:25:49ID:???
>>217
覚えておくので正解
0220nobodyさん2006/01/26(木) 14:24:27ID:ltI+aLo5
$data =~ /(\d) (\d)/g;なんてことをしたときに、
$1と$2のリストをそれぞれ違う配列に入れたいのですがどのようにしたら良いでしょうか?
どなたか教えて頂けると嬉しいです。。
0221nobodyさん2006/01/26(木) 14:27:08ID:???
push(@list1, $1);
push(@list2, $2);
02222202006/01/26(木) 14:33:36ID:???
分かりにくくて済みません_ _
###$data###
3 6
2 8
9 2
となっていたとき、
@test == qw(3 2 9);@test2 == qw(6 8 2);
となる様に/(\d) (\d)/の正規表現を利用して処理をしたいです。
二回正規表現を通して処理をすることも出来るのですが、単純に二倍の処理量になってしまうので。。
0223nobodyさん2006/01/26(木) 14:48:40ID:???
>222
>>221
終了
次
0224nobodyさん2006/01/26(木) 14:52:35ID:???
>>222
my $data = <<'EOD';
3 6
2 8
9 2
EOD
my(@test, @test2);
push(@test, $1), push(@test2, $2) while $data =~ /(\d) (\d)/g;
print join ' / ', 'test', @test, "\n";
print join ' / ', 'test2', @test2, "\n";
02252202006/01/26(木) 14:59:11ID:???
>>224
ありがとうございます。出来ました!
0226nobodyさん2006/01/26(木) 15:08:19ID:pZnDhk3y
コーディングに関する質問じゃないんだけど
なゆ板 を探してます。
なゆ板本体一式、提供よろしく。
0227nobodyさん2006/01/26(木) 15:23:23ID:???
>>226
スレ違い。
0228nobodyさん2006/01/26(木) 15:49:07ID:???
>>226
【CGI】こんなCGI探してますver.19
http://pc8.2ch.net/test/read.cgi/hp/1134255607/
0229nobodyさん2006/01/26(木) 15:57:50ID:pZnDhk3y
>>228
ありがとん
0230nobodyさん2006/01/27(金) 02:13:52ID:fitN0QJi
おそらくリファレンスの解釈がどこか間違っているのだと思いますが、
どうしても分かりません。
どうして下記スクリプトのパターンA/Bは違う結果が出るのでしょうか?

---

#!/usr/bin/perl
use strict; use Jcode;
my $henka= "%CA%D1%B2%BD"; #EUC / URIエスケープ / 変化
my $encoding = 'utf8';
my $j = new Jcode;
# パターンA
my $a1 = uri_decode( $henka ); my $a2 = encode( $a1, 'utf8' );
# パターンB
my $b = encode( uri_decode( $henka ), 'utf8' );
# 書き出し
print "Content-type: text/html\n\n";
print "パターンA:" . $a1 . " / " . "<br />パターンB:" . $b;
exit;
# サブルーチン
sub encode {
my( $str, $enc ) = @_;
$enc = $encoding unless( $enc );
return( $j->set(\$str)->$enc );
}
sub uri_decode {
my $str = shift;
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
return( $str );
}
02312302006/01/27(金) 02:15:51ID:???
>>230は出来る限り省略していますので
見づらいかも知れません。

なお、Perl 5.8.3
スクリプトの文字コードはUTF-8です。
02322302006/01/27(金) 02:23:01ID:???
連投すいません。
書き出すスクリプトを間違えてしまいました。
>>230は無しで改めて質問します。
02332302006/01/27(金) 02:52:17ID:fitN0QJi
度重なる連投申し訳ありません。

EUC-JPでURIエスケープされた「変化」である
「%CA%D1%B2%BD」を取得したいのですが、
どうしても出来ません。

どなたかご指摘いただけないでしょうか?

Perl 5.8.3 / UTF-8
---
#!/usr/bin/perl

use strict;
use warnings;
use Jcode;

my $word = "変化";
my $j = new Jcode;

# EUCに変換
my $word = $j->set(\$word)->euc;
# URIエスケープ
$word =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$word =~ tr/ /+/;
# 書き出し
print "Content-type: text/html\n\n";
print $word;
exit;
0234nobodyさん2006/01/27(金) 03:01:30ID:???
packじゃね?もう忘れたけど。
02352332006/01/27(金) 03:07:08ID:???
>>234
いや、他の単語だと問題なく取得できるんですよ。
ちなみにURIエスケープは、Perlメモさんのコードを流用しています。

昔よく見たsjis系の文字化けのEUC版かな?と思いきや、
ネットにそういう情報転がってないですし…

正直、お手上げ状態になってます。
0236nobodyさん2006/01/27(金) 03:16:24ID:???
じゃあ"変化"を'へんか'にするとか。当てずっぽうだけど。
0237nobodyさん2006/01/27(金) 03:16:57ID:???
'へんか'じゃなくて'変化'ね。変換忘れた。
02382332006/01/27(金) 03:18:59ID:???
>>237
いや、失礼ながら明らかに意味ないと思うんですけど
0239nobodyさん2006/01/27(金) 03:26:57ID:???
my $word = "変化";

my $word = $j->

2回myしてるのは何か意味ある?失礼ながらだけど。
0240nobodyさん2006/01/27(金) 03:27:15ID:???
>235=233
ネットに情報、転がってますよ。
ttp://naoya.dyndns.org/~naoya/mt/archives/000611.html
ttp://www.hikoboshi.org/perl/doc/encode.html
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
0241nobodyさん2006/01/27(金) 03:31:49ID:???
>233
「できません」じゃなくて
「これこれの結果を期待したが結果はこれこれでした」でしょ。
あと他の例だとどうなったとか。

まぁぶっちゃけそんなこと書かなくても解るがな。
0242nobodyさん2006/01/27(金) 03:36:30ID:???
>>233
単にJcodeが渡された文字のエンコード判定できなかっただけだと思う。

my $word = $j->set(\$word,'utf8')->euc;

ってやってみ。
02432332006/01/27(金) 03:43:34ID:???
>>239
よれよれ具合を如実に表してます。typoですorz

>>240
UTF8フラグに関わることしてないと思うんですが
いかがでしょう?

>>241
ごくシンプルな例なので必要ないかと判断しました。
でも言葉足らずだったとは思います。
ご指摘ありがとうございました。

>>242
ビンゴでした!

入力コードの自動判定失敗の理由は不明ですが、
常に明示しておいた方がよさそうですね。

ありがとうございます。
0244nobodyさん2006/01/27(金) 09:39:12ID:???
Perlで処理を行った後、30秒後にある処理をキックしたいんですが、

処理A
処理A終了・・・
system("hoge.pl 43232");  ←これの中でsleep 30;をやっている

みたいな書き方だと、一部のブラウザでは30秒ウェイトが発生してしまいます。
普通に、コマンドみたいな形でキックしたいだけなんですが、system以外に何か良いコマンドはないでしょうか?
0245nobodyさん2006/01/27(金) 12:13:09ID:???
>>244
なぜその場でなく30秒後にしたいのかにもよるけど、
そういう場合はforkを使ってプロセスを分ける。
0246ヽ(´ー`)ノ ◆.ogCuANUcE 2006/01/27(金) 12:17:01ID:???
atd が動いてるなら at でジョブを投げるのも手だな。
待ち状態なら後からキャンセルもできるし。
0247nobodyさん2006/01/27(金) 12:55:57ID:???
atは許可されてるかどうかが問題。
使えれば便利だろうけど。
0248nobodyさん2006/01/27(金) 13:46:48ID:???
  unless (A == B) { }
  else {}
と
  if (A != B) {}
  else { }
とでは、どちらが速いでしょうか
0249nobodyさん2006/01/27(金) 14:04:36ID:???
同じじゃない?
0250nobodyさん2006/01/27(金) 15:34:07ID:???
そんな差を気にするくらいならPerlを使うべきではない
0251nobodyさん2006/01/27(金) 15:41:22ID:???
ベンチも取れんのかお前はー!
0252nobodyさん2006/01/27(金) 15:44:22ID:???
公園にいけばたいていあるのにな。
0253nobodyさん2006/01/27(金) 15:48:33ID:???
>>248
気になるなら自分で調べるなりさー…
100万回くらい繰り返さないと差なんて出ねーよ。

Benchmark: timing 1000000 iterations of not_equal, unless...
 not_equal: 0 wallclock secs ( 0.20 usr + 0.00 sys = 0.20 CPU) @ 4950495.05/s (n=1000000)
 (warning: too few iterations for a reliable count)
 unless: 2 wallclock secs ( 0.27 usr + 0.00 sys = 0.27 CPU) @ 3759398.50/s (n=1000000)
 (warning: too few iterations for a reliable count)
0254nobodyさん2006/01/28(土) 00:39:19ID:???
>>253
お前いいヤツだな
0255nobodyさん2006/01/28(土) 05:56:33ID:ZADCbzDw
$aに文字[abc]が入っていた場合、 $a1 = hoge;
$bに文字[def]が入っていた場合、 $a1 = hogehoge;
みたいにすることはできますでしょうか?
0256nobodyさん2006/01/28(土) 06:54:55ID:???
if($a eq 'abc'){
  $a1 = ''hoge;
}
if($b eq 'def'){
  $a1 = ''hogehoge;
}
もし $b の 処理のとき $a1 に何かが入っていない場合であるなら
if(!$a1 && ($b eq 'def')){
で
0257nobodyさん2006/01/28(土) 06:55:30ID:???
ごめ
$a1 に代入する文字列が '' の外に出ちゃってるw
02582562006/01/28(土) 07:08:29ID:ZADCbzDw
>>257さん
ありがとうございます
でもこれとはちょっと違うんです
説明下手ですみません

$a = [email protected]だとして
[@xx.xx]の場合、$a1 = @hoge.ne.jp;を代入
$a = [email protected]だとして
[@yy.yy]の場合、$a1 = @hogehoge.ne.jp;を代入

みたいな感じで代入したいんです。
これは可能でしょうか?
何どもすみません
0259nobodyさん2006/01/28(土) 07:15:16ID:???
my($user, $host) = split(/\@/, $mailaddress);
my($newhost);

if($host eq 'abcdefg.ne.jp'){
  $newhost = 'hoge.ne.jp';
}elsif($host eq 'vwxyz.co.jp'){
  $newhost = 'hogehoge.ne.jp';
}else{
  $newhost = 'heogehogehoge.or.jp';
}
02602562006/01/28(土) 07:18:06ID:ZADCbzDw
分かりやすく書きますmm
もし$aが文字列[abc]を含んでいたら
$a1 = hoge;
# $a = "abc123"; だとしてもこの処理を行う
もし$aが文字列[def]を含んでいたら
$a1 = hogehoge;
# $a = "def123"; だとしてもこの処理を行う
0261nobodyさん2006/01/28(土) 07:23:22ID:???
ほんとそれが「判別したいこと」のすべて?
そうと信じて最後に・・・

my($mailaddress, $newhost);

if($mailaddress =~ /abc/i){
  $newhost = 'hoge.ne.jp';
}elsif($mailaddress =~ /def/i){
  $newhost = 'hogehoge.ne.jp';
}else{
  $newhost = 'heogehogehoge.or.jp';
}
0262nobodyさん2006/01/28(土) 07:27:19ID:???
>>260
index("abc", $a);
で次の条件はなんだ
"Abc"の場合も含むとかか
0263nobodyさん2006/01/28(土) 07:35:30ID:???
いくら例だとしても $1 とか $b は使うべきではないと思うんだけど・・・
これが sort に関してだったら返事してないw


>262
面倒だから正規表現でやったお
0264nobodyさん2006/01/28(土) 07:37:21ID:???
$1 じゃねぇや $a ね
0265nobodyさん2006/01/28(土) 07:38:02ID:???
今気が付いたんだけど、名前欄の数字違いますからw
02662552006/01/28(土) 07:45:20ID:ZADCbzDw
皆さん朝っぱらからご迷惑おかけしますmm
どれもできませんでした(^^;
>>261さん、わかりにくいくてすみません

アドレスをフォームで送ってもらい、そのアドレス欄
$mailに docomoの文字が入っていた場合、
$mailto = [email protected]
$mailに ezの文字が入っていた場合、
$mailto = [email protected]
みたいな文字列を返したいんです
わかりにくいですかね(^^;
0267nobodyさん2006/01/28(土) 07:59:12ID:???
暇なので反応w

my($user, $host) = split(/\@/, $mail);

if($host =~ /docomo\.ne\.jp$/i){
  # DoCoMo の場合の処理

}elsif{$host =~ /ezweb\.ne\.jp$/){
  # au の場合の処理

}elsif{$host =~ /[dhtcrknsq]\.vodafone\.ne\.jp$/i){
  # vodafone の場合の処理

}else{
  # どれにも一致しない場合
}
0268nobodyさん2006/01/28(土) 08:00:51ID:???
訂正


my($user, $host) = split(/\@/, $mail);

if($host =~ /^docomo\.ne\.jp$/i){
  # DoCoMo の場合の処理

}elsif{$host =~ /^ezweb\.ne\.jp$/){
  # au の場合の処理

}elsif{$host =~ /^[dhtcrknsq]\.vodafone\.ne\.jp$/i){
  # vodafone の場合の処理

}else{
  # どれにも一致しない場合
}
0269nobodyさん2006/01/28(土) 08:09:12ID:???
冗長
0270nobodyさん2006/01/28(土) 08:21:36ID:Tyr9AIOh
>>268間違ってるよ
知ったかすんな(^ω^)
0271nobodyさん2006/01/28(土) 08:25:12ID:???
例も示せない奴m9(^Д^)
0272nobodyさん2006/01/28(土) 08:26:52ID:???
間違い指摘じゃなくてお手本プリーズ
0273nobodyさん2006/01/28(土) 08:28:37ID:???
>269-270
>272
02742552006/01/28(土) 08:29:15ID:ZADCbzDw
>>270さん
もし分かるようでしたら教えてください
お願いします
0275nobodyさん2006/01/28(土) 08:35:41ID:???
>255=274
>270は突付いてみただけで何も書けない人なので待つだけ無駄だよん(^ω^)
02762552006/01/28(土) 08:43:35ID:ZADCbzDw
>>275さん
そうでしたか
皆様ありがとうございました
できなかったんですが
これを参考にsplit(よくわかんない)から勉強しなおしてきます
どうもありがとう
0277nobodyさん2006/01/28(土) 08:46:09ID:???
splitしなくても
/\@docomo\.ne\.jp$/i
とかでもOKです。
0278nobodyさん2006/01/28(土) 08:53:28ID:ZADCbzDw
require 'cgi-lib.pl';
&ReadParse(*in);
って数字以外扱えないとかありますか?
0279nobodyさん2006/01/28(土) 08:54:03ID:???
主語述語をハッキリと
0280nobodyさん2006/01/28(土) 09:14:12ID:ZADCbzDw
#こんな感じで書いてます

#!/usr/bin/perl
require 'cgi-lib.pl';

&ReadParse(*in);
my $acc = $in{'a'};
my $url = $in{'u'};

if($url = ~/ne\.jp$/i){
$st = "31";
}else{
$st = "23";
}
$ge = $st*$acc;
print <<"EOM";
content-type:text/html\n
<html><head><title>hoger</title></head><body>\n
<a href="$url">$url</a><br>
答えは$geです。<br>
</body></html>
EOM
exit;
0281nobodyさん2006/01/28(土) 09:16:38ID:???
おまえ日本語読めてますか〜?
主語述語どころかさっきよりも日本語変になってんじゃんけ
0282nobodyさん2006/01/28(土) 09:23:48ID:ZADCbzDw
>>281さん
すいません
言葉ではうまくいえないので
スクリプトさらしたほうがいいかと思って…
0283nobodyさん2006/01/28(土) 09:25:17ID:???
こんな風に書いててこんなエラーが出てます
どこか間違えてますでしょうか?

ソース開始



エラー内容開始



って書くのが普通じゃないかなと
0284nobodyさん2006/01/28(土) 09:29:23ID:ZADCbzDw
>>283さん
フォローありがとうございます
エラーは
<a href="$url">$url</a>が正しく表示されない(31となる)
どんなURLでもすべて["31"]が返ってくる
です
一応動作はします
0285nobodyさん2006/01/28(土) 09:31:49ID:???
そりゃそうだ
=~ ne\.jp$/i は「文字列の最後が ne.jp で終わっていれば」って意味だから
日本の大概のプロバイダのメールアドレスは一致するだろう
0286nobodyさん2006/01/28(土) 13:28:07ID:Tyr9AIOh
でも
0287nobodyさん2006/01/28(土) 13:40:33ID:???
>>280
前も見たな、こんなの
> if($url = ~/ne\.jp$/i){
正規表現マッチは =~ であって = ~ は意味が違う
0288nobodyさん2006/01/28(土) 13:59:03ID:ZADCbzDw
>>287さん
ありがとうございます!
それが原因でしたm(_ _)m
でもこれって最後の文字が[ne.jp]だったらってことですよね?
文の途中に入ってても処理してくれるようにはできないんですか?
しつこいようですがお願いいたします
0289nobodyさん2006/01/28(土) 14:05:22ID:???
正規表現でググればわかるんじゃないかなー
0290nobodyさん2006/01/28(土) 17:23:41ID:ZADCbzDw
>>289さん
正規表現マッチかなり便利そうですね
まだPerlかじりかけでして、
初歩的な質問ばかりしてご迷惑かけたことお詫びします><
これ見てやってみようと思います
0291nobodyさん2006/01/28(土) 17:52:35ID:???
他サーバーにあるHTMLファイルを読み込みたいと思っています。
LWPやHTTP:Liteというモジュールを使う方法をがあるようですが
これらが一般的でしょうか?
プロバイダのサーバにはインストールされていないようなので
他にも方法があれば教えてください。
0292nobodyさん2006/01/28(土) 18:32:38ID:???
>>291
だうそして、例えば Lib というディレクトリにおいて、
use lib "./Lib";
とやれば普通に require したり use したりできるようになるはずだべ。
0293nobodyさん2006/01/28(土) 18:34:53ID:kB13KdYy
すいません。教えて下さい。
クッキーをセットするサブルーチンで、
print "Content-type: text/html; charset=Shift_JIS\n";
print "set-Cookie: $COOKIE_NAME=$value; expires=$date\n\n";
と出力していて、うまくセットされていたのですが、このサブルーチン
より先に別のサブルーチンを呼び出すよう変更した途端、クッキーがセ
ットされなくなりました。その先に呼び出すサブルーチンその中に
print "Content-type: text/html; charset=Shift_JIS\n";
があるためと思われますが、クッキーセットのサブルーチンの
print "Content-type: text/html; charset=Shift_JIS\n";
を削ってもうまくセットされません。どうしてでしょうか?
0294nobodyさん2006/01/28(土) 18:43:16ID:???
予想:ブラウザに set-Cookie: $COOKIE_NAME=$value; expires=$date が表示されてる
02952932006/01/28(土) 18:54:28ID:HCtuTUwq
>>294
はい。その通りです。どうしたら良いでしょうか?
0296nobodyさん2006/01/28(土) 19:01:01ID:???
>>292
できました!
てっきりインストールしないと使えないものかと思ってました。
レスありがとうございました。
0297nobodyさん2006/01/28(土) 19:08:44ID:???
>>295
>print "Content-type: text/html; charset=Shift_JIS\n";
お前、この文の意味わかってるか?
02982932006/01/28(土) 19:43:54ID:3C15B2MW
>>297
すいません。分かりません。教えて下さい。
0299nobodyさん2006/01/28(土) 19:46:18ID:???
>>293のIDが全て違うから、もうこの話は終わりにしよう
03002932006/01/28(土) 21:21:54ID:wIuX5Wpl
すいません。そういう体質なもので仕方がないのです。
どなたか引き続き教えて下さい。
0301nobodyさん2006/01/28(土) 21:24:40ID:???
ここはPerlのコーディングスレでCGIスレではないんだが。
0302nobodyさん2006/01/28(土) 21:25:11ID:???
>>300
オライリーの「CGIプログラミング」15分でいいから立ち読みしてこい。
0303nobodyさん2006/01/28(土) 22:56:49ID:???
perl で例えばファイルをコピーする場合に、
何%終了のようなメッセージをどうしたら出力できますか?
0304nobodyさん2006/01/28(土) 23:19:15ID:???
ActiveXとかFlashとか使わないと無理
0305nobodyさん2006/01/28(土) 23:23:24ID:???
いや、ファイルをコピーの状況にもよるだろ。
CGIスレじゃないし、ローカル上のやりとりだと仮定すればできる。
具体性に欠ける質問には答える気0だけどな。
0306nobodyさん2006/01/28(土) 23:25:39ID:???
>>303
stat関数でファイルサイズを求めておき、read,writeのループをしながら読んだ・書いたバイト
数を累積していき、時々%を計算してprintすれば良いんじゃない?
0307nobodyさん2006/01/29(日) 02:18:43ID:???
1レスポンスしか投げれないからなぁ。
Ajaxからめたら強引にできそうだけど。
0308nobodyさん2006/01/29(日) 02:24:18ID:???
俺だったら FTP 開けるなw
0309nobodyさん2006/01/29(日) 09:20:15ID:???
ネットワーク越しにコピーするとは誰も言ってないのに...
Ajaxとか... FTPとか...
キミ達の妄想力には呆れるばかりだよ。
0310nobodyさん2006/01/29(日) 10:29:17ID:???
友達がいないんだからしかたねーじゃん。
0311nobodyさん2006/01/29(日) 11:05:56ID:???
>>303がどちらとも取れる質問なんだから、
どう答えても問題なし。

明確な回答が欲しければ、明確な質問をすること。
03123092006/01/29(日) 11:15:29ID:???
俺が質問者だと思い込むキミの妄想力には呆れるばかりだよ。
0313nobodyさん2006/01/29(日) 11:18:07ID:???
>>312
あんた誰?
03143092006/01/29(日) 11:58:10ID:???
俺は309だよ。
0315nobodyさん2006/01/29(日) 12:05:03ID:???
じゃあどうでも良いな。
03163092006/01/29(日) 12:48:06ID:???
騙り本気でウザいんだけど
03173092006/01/29(日) 13:08:17ID:???
>>316
そうか? 俺はお前に騙られても別にウザくないぞ。
0318nobodyさん2006/01/29(日) 13:09:37ID:???
最初にあおったのは309だと思う
(゚∀゚)ノ
03193092006/01/29(日) 13:14:28ID:???
>>312
>>314
>>316
>>317
はいはいわろすわろす
■ このスレッドは過去ログ倉庫に格納されています