Perlコーディング初心者質問スレ Part 44
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/10/17(月) 00:47:17ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0554552
2005/11/21(月) 09:10:44ID:HZcu4vs3今やりたいことは、稼動中の掲示板の改造です。
$ENV{'QUERY_STRING'}からGETで取得している値を、
$ENV{'PATH_INFO'}から取得したいと思っています。
◆サーバー:ロリポップです。
◆コード
値を確かめるために、下のようなコードだけを記述したファイルを
アップし、適当な引数を付けてテストしていました。
print"Content-type: text/html\n\n";
print qq(
<HTML><HEAD><meta http-equiv=Content-Type content=text/html; charset=shift-jis>
</HEAD>
<BODY>
$ENV{'PATH_INFO'}
</BODY>
</HTML>
);
exit;
よろしくお願いいたします。
0555nobodyさん
2005/11/21(月) 09:19:28ID:???PATH_INFOを勘違いしてるって事は無いよね
テストに使ったURLはどういう形式?実在じゃなくていいから
0556nobodyさん
2005/11/21(月) 09:26:41ID:HZcu4vs3このような形式です。
http://ドメイン/bbs/index.cgi?room=1
よろしくお願いいたします。
0557nobodyさん
2005/11/21(月) 09:30:28ID:???getメソッドの取得はquery_stringのままでいいと思うけど、変更しないといけない理由は?
0558ヽ(´ー`)ノ ◆.ogCuANUcE
2005/11/21(月) 09:39:19ID:???それ、PATH_INFO 含まれてないし。とりあえず CGI.pm のドキュメント嫁。
OBTAINING THE SCRIPT'S URL と FETCHING ENVIRONMENT VARIABLES の path_info() のところ。
多分探せば日本語訳もある。
0559nobodyさん
2005/11/21(月) 10:31:19ID:HZcu4vs3何か私が勘違いをしているのでしょうかね。
ドキュメントを読んで見ます。
0560nobodyさん
2005/11/21(月) 11:37:26ID:5KZiaClrif(@abc[1] eq $name){&error}
@abc=split(/\,/,@aaa[1]);
if(@abc[1] eq $name){&error}
@abc=split(/\,/,@aaa[2]);if(@abc[1] eq $name){&error}
これを一行にしたくて@abc=split(/\,/,@aaa[0,1,2]);
if(@abc[1] eq $name){&error}
にしたんですけど機能しません
どこを直したらよいのでしょうか?
0561nobodyさん
2005/11/21(月) 11:44:26ID:???splitは配列を受けられない
見たところその処理はチェックのみで代入は不要?
(split(/\,/, $_))[1] eq $name && &error foreach @aaa[0,1,2];
こんな感じでどうだろ
0562nobodyさん
2005/11/21(月) 11:52:25ID:5KZiaClrレスありがとうございます
実際にはサブルーチンで代入します
すみません
使用目的は連続投稿を防ぐためで、ログファイルに同一内容があるのかチェックをしたいのです
0563nobodyさん
2005/11/21(月) 12:02:55ID:???@abc=split(/\,/,@aaa[0,1,2]);
のsplit(/\,/,@aaa[0,1,2]);の部分がサブルーチンの戻り値ということかな
期待する内容は(0の名前, 1の名前, 2の名前)という配列ということでOK?
それなら
map { +(split /,/, $_)[1] } @aaa[0,1,2];
とか。
でも、それは構造を考え直したほうが良いかも・・・
0565nobodyさん
2005/11/21(月) 12:29:45ID:???この辺参考にどぞー
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html
0566nobodyさん
2005/11/21(月) 15:57:20ID:???$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
open (DATA, "<$log");
flock (DATA, 1);
@line = <DATA>;
close (DATA);
# $wordはフォームから受け取った検索対象文字列です
# 検索対象文字列はスペース区切りで複数設定可能にしてあります
$word =~ s/ | /\t/g;
&jcode::convert (\$word, "euc", "sjis");
@words = split (/\t/, $word);
foreach (@line) {
&jcode::convert (\$_, "euc", "sjis");
# ログはタブ区切りです
@data = split (/\t/, $_);
foreach (0 .. $#words) {
# &error ($words[$_]); # ※1
# $data[6]が記事の本文です
if ($data[6] =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:$words[$_])/) {
# &error ($words[$_]); # ※2
検索文字に\を入れて※1の部分でエラーを出そうとすると正常にエラー画面に\が表示されるのですが、
※2で出そうとしても、その前にCGIエラーで落ちてしまいます。
下から2行目のif文内の$words[$_]に\が入った時点で落ちると思うのですが、
どのようにしたら正常に検索処理を行なえるでしょうか。
0567nobodyさん
2005/11/21(月) 16:06:06ID:???最低限そうしないと、いろいろ死ぬぜ?
0568566
2005/11/21(月) 16:19:18ID:???レスありがとうございます。
以下のように修正することで解決できました。
- @words = split (/\t/, $word);
+ @words = split (/\t/, quotemeta ($word));
0569nobodyさん
2005/11/22(火) 16:26:52ID:???オンラインのレンタルスペースにアップロードして稼動させようとしています.
ローカルできちんと動くスクリプトを組むまではOKだったのですが,
レンタルスペースで動かそうとすると,様々なエラーがでてしまいます.
レンタルスペースの仕様書を見て,使えないモジュールのチェックなどはもちろんですが,
ファイル名の大文字や小文字の判定など,他に気をつけることはありますでしょうか?
0570nobodyさん
2005/11/22(火) 16:36:17ID:???0571nobodyさん
2005/11/22(火) 17:10:04ID:???0572nobodyさん
2005/11/22(火) 17:18:46ID:???質問が少し漠然すぎたかもしれませんので,具体的な質問に変更します.
$year=2005,$month=11;
@allfiles=(haman200511,Amuro200511);
@persons=(Amuro,Quess,Char);
#指定された年月かつ,存在する人物のファイル名を取得
for my $file (@allfiles) {
for my $person (@persons) {
if($file eq "$person$year$month.dat"){
push(@files,$file);
}
}
}
0573nobodyさん
2005/11/22(火) 17:19:42ID:???SAJAX
http://www.modernmethod.com/sajax/
0574nobodyさん
2005/11/22(火) 17:21:11ID:???ローカル @files=(Amuro200511.dat);
レンタル @files=();
この箇所の挙動がレンタルとローカルで異なっています.
ローカルのPerlのVerは5.8で,レンタルのほうは5.6なのですが,
Verによる挙動の違いというようなものがあるのでしょうか?
訂正
@allfiles=(haman200511.dat,Amuro200511.dat);
0577nobodyさん
2005/11/22(火) 17:31:51ID:???CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
0579nobodyさん
2005/11/22(火) 17:53:28ID:eRlqTFqT@allfiles=(haman200511,Amuro200511);
@persons=(Amuro,Quess,Char);
↓
my($year, $month) = (2005, 11);
my(@allfiles) = ("haman200511", "Amuro200511");
my(@persons) = ("Amuro", "Quess", "Char");
0581nobodyさん
2005/11/22(火) 18:08:43ID:???0582nobodyさん
2005/11/22(火) 19:46:43ID:???0583nobodyさん
2005/11/22(火) 20:01:32ID:???0584nobodyさん
2005/11/22(火) 20:08:08ID:???0585nobodyさん
2005/11/22(火) 20:22:48ID:???use warningしてみましたが,状況は進展しませんでした.
>>579
実際のスクリプトではクォートしています.
抄写するにあたり,変数の中身を示しておこうと思い,
記述したときの手抜かりで,クオートし忘れました,申し訳ありません.
0587nobodyさん
2005/11/22(火) 20:35:50ID:???なんで誰も突っ込まないw
0588nobodyさん
2005/11/22(火) 21:08:47ID:???WInXp&Apacheのローカル環境だと大丈夫なのですが,レンタルスペースだとダメなんです.
ローカルとサーバの違いというものがよく判らなくて,デバッグに四苦八苦という状態です.
>>587
#!/usr/bin/perl ですね.すみません.
もう少し自分で頑張ってみてダメなようでしたら,また質問するかもしれませんが,
そのときはよろしくお願いします.
0589nobodyさん
2005/11/22(火) 21:15:52ID:???ローカルがWinってのは先に言おうな。話が全然違ってくるからな。
で、俺が言ってるのは>>572にクォート入れても動かないのか、なんだが。
もういいや。
0590nobodyさん
2005/11/22(火) 21:25:32ID:???無駄なやりとりが増えるから落ち着いてから出直してきなさい。
OSが異なれば改行の扱いが変わったりもするし、
スクリプトやデータファイルの文字コードに起因しているかもしれんし、
マルチバイトなファイル名/ディレクトリ名なんて脱力ものな原因かもしれんし、
FTP転送がまずいだけかもしれん。
typo
様々なエラーがでてしまいます。
挙動がレンタルとローカルで異なっています。
・・・神かエスパーじゃなきゃわからんよ。
0591nobodyさん
2005/11/22(火) 22:02:19ID:???0593974
2005/11/22(火) 23:14:39ID:???文字コードなんか気にせずに秀丸で文字コードをshift_jisに設定して書いて
マスタ、所が全角英数字を半角英数字にしようとしたら、プログラム自体は
jcode::tr(\$arg_[$i], '0-9A-Za-z', '0-9A-Za-z');
たったのこれっぽっちなんだけど、これって文字コードがEUC-JPじゃないと
正確に変換出来ないんだよね、やっぱり皆さんもperlのプログラム書くときの
文字コードはEUC-JPデツカ?
0594nobodyさん
2005/11/22(火) 23:18:40ID:???0595nobodyさん
2005/11/22(火) 23:21:51ID:???0596nobodyさん
2005/11/23(水) 04:24:57ID:fNvsPnqm本のサンプルコードで理解できないところがあるんで教えてください。
$Value =~ /(\w+)\.(\w+)$/;
なんて書くときの、最後の、
$/
って何を表すんですか?
ファイル名を取り出すようなところで使われてるんだけど…。
これなに?
下の例だと$っていらない気がするんだが…。
こんな感じ
例:
if($FileName =~ /(\w+)\.(\w+)$/){
$FileName = "$1\.$2";
}
0597nobodyさん
2005/11/23(水) 04:32:09ID:???http://x-web.pobox.ne.jp/fcgi/fcgi_20.html
0598596
2005/11/23(水) 04:38:15ID:fNvsPnqmネ申!!
ありがとうございます。
ちゅーか、大喜びするほどじゃない…。基礎ネタ?
修行していつか還元します…。
0599nobodyさん
2005/11/23(水) 08:50:52ID:???0600nobodyさん
2005/11/23(水) 08:56:54ID:???0601nobodyさん
2005/11/23(水) 10:33:48ID:???0603nobodyさん
2005/11/23(水) 16:24:36ID:???書かれているんだろうか?
0604nobodyさん
2005/11/23(水) 16:45:50ID:???コストが折り合えば使えるものはなんでも柔軟に使い、使えないものは使わない。
これを使わなきゃダメなんて・・・ やり方がいくらでもある以上、口が裂けても言えん
0605nobodyさん
2005/11/23(水) 16:52:23ID:???0606nobodyさん
2005/11/23(水) 16:57:40ID:JssfbXnp0607nobodyさん
2005/11/23(水) 16:59:58ID:???異常な執念深さだな。 File::Spec と File::Basename に何かコンプレックスでもあるのか?
0608nobodyさん
2005/11/23(水) 17:11:23ID:???>>599と>>602は俺じゃないけど。
標準で付いてくるモジュールぐらい、ちゃんと使ったらどうよ。
(不完全な)車輪の再発明を見てると馬鹿かと思う。
0609nobodyさん
2005/11/23(水) 17:20:16ID:???ほほう。
元質問が「本のサンプルコード」に関する質問だっていうのに、
File::Spec や File::Basename を持ち出すのが適切だとでも?
0610nobodyさん
2005/11/23(水) 17:30:15ID:QqvL0TVYやはり化けてしまいます。原因として何が考えられるでしょうか?
0611nobodyさん
2005/11/23(水) 17:32:10ID:???0613nobodyさん
2005/11/23(水) 17:40:21ID:???0616nobodyさん
2005/11/23(水) 18:34:04ID:???0617nobodyさん
2005/11/23(水) 19:20:27ID:???0619nobodyさん
2005/11/23(水) 20:09:38ID:???0620nobodyさん
2005/11/23(水) 20:10:39ID:???0621nobodyさん
2005/11/23(水) 20:21:18ID:???良かったらどうぞです
http://user.ftth100.com/mirrorhenkan/perl/
0622nobodyさん
2005/11/23(水) 20:57:03ID:???俺様専用スクリプトだって、Unix環境専用スクリプトだってアリなんだし、
必ず使えってことも無いでしょ。
必要要件を満たさないものを自作するよりは、
素直に使った方がいいけどさ。
0623nobodyさん
2005/11/23(水) 22:28:38ID:5cxNyXSuwindowsXPSP2
ActivePerl-5.8.7.813-MSWin32-x86-148120.msi
を使っています。
plファイル自体の文字コード EUC
内部で扱う文字コード EUC
標準出力 Shift-JIS
標準入力 EUC
POSTデータ等で受け取ったデータはshift-jisであれば内部処理用にEUCに変換する。
という構成でプログラムを書きたく、検索した結果、下記の他いろいろ試してみた
のですがうまくいきません。
文字化けで出力されたり、
"\x{fffd}" does not map to shiftjis at〜〜
と出力されたりします。
↓
#STDIN と STDOUT を別々にコード変換する
use encoding 'euc-jp', STDOUT=>'shift_jis';
どうかお力添えをして頂けないでしょうか。
よろしくお願い致します。
0624nobodyさん
2005/11/23(水) 22:34:46ID:???いろいろやったんなら試したこと全部書かないと
レスしても 「それはやってみましたがダメでしたとかいわれて」殴ってやりたくなるからな〜
レスつきにくいぞ
とりあえず jcode.pl でも使っとけ
0625nobodyさん
2005/11/23(水) 22:48:30ID:???0626nobodyさん
2005/11/23(水) 23:04:32ID:???携帯?
0628623
2005/11/23(水) 23:46:19ID:???>>625
>>626
>>627
みなさんアドバイスありがとうございます。
携帯からの入出力を想定しているためこのような仕様で書きたいと思いました。
Perl5.8Unicodeメモのページを読み、記載されてあった
簡単なところから
まず、
use encoding "euc-jp";
print "こんにちわ\n";
としてDOSで実行してみたのですが
「、ウ、ヒ、チ、・」
と表示されてしまいます。
自分なりに
use encoding "euc-jp";
use Encode qw/ encode decode /;
use Encode qw(from_to);
print from_to("あああ", "shift_jis", "euc-jp");
ともしてみたのですが、
Wide character in subroutine entry at C:/Perl/lib/Encode.pm line 186.
と出てしまいます。
おそらくこれはutf8フラグを切り落としていないからだと
思いますが、euc-jpでソースを書いて出力する際には
一つ一つ文字コードを変換していかないといけないのでしょうか?
0629nobodyさん
2005/11/24(木) 00:02:56ID:???> 「、ウ、ヒ、チ、・」 と表示されてしまいます。
君が自分で EUC-JP の文字列を Shift_JIS のコンソールへ
出力しているのだから化けて当然。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encoding.html
> 自分なりに(略)ともしてみたのですが、
from_to() の使い方を間違えている。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encode.html
0630nobodyさん
2005/11/24(木) 00:46:53ID:???>>623に書かれている
> use encoding 'euc-jp', STDOUT=>'shift_jis';
これでだめなん?
0631nobodyさん
2005/11/24(木) 04:22:56ID:QV+2W1Ju&sub1;
sub sub1{$hogeをさらに加工;&sub2;return}
sub sub2{$hogeをさらにさらに加工;return}
というようなことをしたいんですが、sub2になるとせっかく加工した$hogeが初期化されてしまってるようなんですが、どう対処すればいいでしょうか?
0632nobodyさん
2005/11/24(木) 04:35:08ID:???my宣言でもしてない限り、その書き方なら$hogeは初期化されないけど。
何か間違ってない? つかuse strictやれと小一時間(ry
0633nobodyさん
2005/11/24(木) 04:57:27ID:QV+2W1Juよく見てみたら意味もわからずmy宣言してました。
これをとったらうまくうごきました。
これからも御鞭撻のほど宜しくお願いします。
0634nobodyさん
2005/11/24(木) 09:21:02ID:???グローバルの$hogeをそのまま複数のサブルーチンからいじるのは一般的にいうとあまり行儀のいい
プログラムではないな。変な癖をつけると大きいプログラム書くようになると苦労するよ。
0635nobodyさん
2005/11/24(木) 10:41:05ID:???0636nobodyさん
2005/11/24(木) 11:40:57ID:???0637nobodyさん
2005/11/24(木) 20:39:28ID:???0638nobodyさん
2005/11/24(木) 21:50:23ID:EJIyCJlG0639nobodyさん
2005/11/24(木) 22:02:42ID:???0640nobodyさん
2005/11/25(金) 00:36:53ID:???0641nobodyさん
2005/11/25(金) 06:48:37ID:s5kWftCOmy %data = check('hoge');
if(%data) {print "OK";} else {print "NG";}
exit;
sub check
{
my ($text)=@_;
if($text ne 'hoge') {my %data={'text'=>$text}; return %data;}
return undef;
}
2行目の位置で正常なハッシュ返ってくればエラーが出ないのですが、
undefが返ってくると「Odd number of elements in hash assignment」と
出てしまいます。
こういう、正常ならハッシュ値、異常ならundefみたいな事をしたい
場合には、どういう感じでコーディングすれば良いのでしょうか?
0643nobodyさん
2005/11/25(金) 07:18:43ID:???ありがとうございます。
それでやってみたのですが、やはり
「Odd number of elements in hash assignment」と
出てしまいます。
「return undef;」の所を「my %data; return %data」にしたら
エラーが出なくなったのですが、なんか書き方が
すっきりしないような気もします…。
0644nobodyさん
2005/11/25(金) 07:22:13ID:???'or'と'||'で違うんですね。勉強になりました。
0646641
2005/11/25(金) 07:57:32ID:s5kWftCO正常なハッシュ値が返ってきた時に
「Odd number of elements in hash assignment」と
出てしまいます。
もう、何が何だかわからなくなってきました…onz
0647ヽ(´ー`)ノ ◆.ogCuANUcE
2005/11/25(金) 08:25:17ID:???理解を深めた方がいいかもしれない。
my %data={'text'=>$text};
↓ こう
my %data=('text'=>$text);
return undef;
↓ こう
return ();
0648nobodyさん
2005/11/25(金) 08:35:56ID:???>return undef;
>↓ こう
>return ();
これで解決しました。
>my %data={'text'=>$text};
>↓ こう
>my %data=('text'=>$text);
これについては、最初は()の方で書いていたのですが
http://pc8.2ch.net/test/read.cgi/tech/1131286411/223
ここで、正しくは{}と掲示されたのですが…。
どちらにしても、リストやハッシュについて、理解を深めようと思います。
ありがとうございました。
0649nobodyさん
2005/11/25(金) 11:39:19ID:???http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
0651nobodyさん
2005/11/25(金) 15:44:43ID:63zT9z2i半角英数字、英字は大文字、小文字も含めて
10桁の乱数を生成しようと思い以下のプログラムを書いてみたのですが
数字の乱数しか生成出来ません、どこを直したらいいでしょうか、ご指摘お願いします。@array = (0..9,'A'..'Z','a'..'z');
foreach (1..10) {
my $bar = (rand scalar(@array));
print qq|"$bar"\n|;
}
0652nobodyさん
2005/11/25(金) 15:46:10ID:63zT9z2i@array = (0..9,'A'..'Z','a'..'z');
foreach (1..10) {
my $bar = (rand scalar(@array));
print qq|"$bar"\n|;
}
ご勘弁です
0653nobodyさん
2005/11/25(金) 15:56:15ID:???↑ ↑
scalar(@array)の戻り値は@arrayの要素数
randの引数にそれを渡してるんだから、当然数値しか戻ってこない罠
0654ヽ(´ー`)ノ ◆.ogCuANUcE
2005/11/25(金) 15:56:26ID:???+ my $bar = $array[rand scalar(@array)];
■ このスレッドは過去ログ倉庫に格納されています