Perlコーディング初心者質問スレ Part 59
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2009/02/16(月) 11:42:29ID:gvPTpodw【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
0836nobodyさん
2009/07/27(月) 11:10:44ID:???というコードがあるんですが、何をやっているのかわからないので教えてください。
・@{$foo} は何ですか?$fooでも@fooでもないのでわかりません。
・scalar(@{$foo}) は結局何をしているんでしょうか?
0837nobodyさん
2009/07/27(月) 11:30:52ID:???$fooというリファレンスを、デリファレンスしてる
> ・scalar(@{$foo}) は結局何をしているんでしょうか?
配列の要素数を得てる
スカラーコンテキスト。
my $count = @array;
ってやると、コンテキストで要素数が得られるのと同じ。
0838nobodyさん
2009/07/27(月) 11:42:52ID:???@{$foo}
と書くのも
@$foo
と書くのも一緒だから、覚えとくといいよ。むしろ後者で書く人の方が多い気がするから。
0839nobodyさん
2009/07/27(月) 11:46:28ID:???ありがとうございます。@{$foo}と@$fooは同じなんですね。
@{$foo}なんて書き方、初めてみたんですが、これどんなときにつかうんですか。@$fooだけでいいように思いました。
0840nobodyさん
2009/07/27(月) 12:21:05ID:???Perlはいろんな書き方出来る言語だから、そんなことでいちいち疑問に思ってたら前に進まないよ
というより、@{$foo}の方が丁寧な書き方っていう印象がある。
俺がそう思うということは、たぶん、オライリーのプログラミングPerlや初めてのPerlにはそう書いてあるはず。
0841nobodyさん
2009/07/27(月) 12:35:35ID:???あくまで @{...} が基本形。{} の中はリストリファレンスを返すものなら何でもいい。
@{ ['A'..'Z'] }
@{ $flag ? $bar : baz() }
@{ $foo[1] }
${ $quux }[1]
@{ $quux }[ 1..3 ]
@{"symbolic"} # 文字列ならシンボリックリファレンス
@{bareword} # トークンなら普通の変数
{} の中が単純なスカラー変数の場合は{}を*省略*できる (そして省略する人が多い)。
…と覚えた方が、後で悩まずに済むよ。
0842nobodyさん
2009/07/27(月) 12:39:54ID:???0843nobodyさん
2009/08/07(金) 10:07:16ID:???my $head = 0x00000000; #空の4バイト確保
print (pack( "V", $head) . "\n"); #挙動がおかしいのでちょっと出力してみた
しっかり消滅してるしw
どうしればいいですか。
0844nobodyさん
2009/08/07(金) 10:27:48ID:???よくわからんがhoge.plにそのまま書き込んで実行してみた。
% perl hoge.pl |hex
0x00000000: 00 00 00 00 0a - @@@@J
ちゃんと4バイトの0が出てるので書いてるとおりの動作だな。
これで不満ならどうやって確かめて何がおかしいと思ったのか説明
してもらわないと。
0845nobodyさん
2009/08/07(金) 10:42:44ID:???俺が勝手に使ってるテキストエディタ内の新タブに出力させてたら、エディタの問題だったみたいです。
プロンプト、ファイル出力、共に4バイトありました。
0846nobodyさん
2009/08/12(水) 14:33:18ID:???use CGI::Sendmail;
my %mail = (
To => 'you@2ch.net',
Cc => 'he@2ch.net',
Bcc => 'she@2ch.net',
From => 'me@2ch.net',
Name => "ひろゆき",
Subject => "こんにちは",
Body => <<EOL,
お元気ですか?
では、さようなら
EOL
"Sendmail-path" => "/usr/sbin/sendmail",
"Character-code" => "euc-jp",
);
if ( CGI::Sendmail->new(%mail)->send ) { print "送信完了" }
else { print "送信できませんでした" }
0847nobodyさん
2009/08/12(水) 16:40:16ID:???http://search.cpan.org/dist/MailTools/
http://search.cpan.org/~markov/MailTools-2.04/lib/Mail/Send.pod
http://search.cpan.org/search?m=module&q=Mail&s=1&n=100
0848nobodyさん
2009/08/12(水) 18:05:46ID:XtZqM+tgフォームで受け取った$pass(値はhoge)と
同じくフォームで受け取った$idをファイル名に含んだファイルの二行目をfile()で読み込んで
$data[1](値はhoge)に代入して
if($pass==$data[1]){
print"値は同じです".$pass"==".$data[1];
}
else{
print"値は違います".$pass"==".$data[1];
}
を実行すると
「値は違います hoge==hoge」
と表示されるのですが「値は同じです」と表示させるにはどうしたらいいですか?
0849nobodyさん
2009/08/12(水) 18:10:12ID:???0850nobodyさん
2009/08/12(水) 18:11:08ID:???0851nobodyさん
2009/08/12(水) 18:14:13ID:XtZqM+tg0853nobodyさん
2009/08/13(木) 20:16:07ID:CNJ7rD2pprintfと書きましょうと習ったんだけど
printでも普通に使えるよね?
昔は使えなかったの?
0855nobodyさん
2009/08/13(木) 21:09:54ID:???0856nobodyさん
2009/08/13(木) 22:41:36ID:???0857nobodyさん
2009/08/13(木) 22:44:43ID:???習った>>853は、全ての場合でと勝手に解釈したってことだろ
会話で生じる誤解としては良くある例
0858nobodyさん
2009/08/14(金) 01:16:04ID:???print と sprintf だけ使ってた
びっくらこいた
0859nobodyさん
2009/08/14(金) 01:26:28ID:???こんな書き方できたのか!?って
0860nobodyさん
2009/08/14(金) 02:07:28ID:???html表示するときのフォントをverdanaにしてるんですが
そうすると半角¥がバックスラッシュで表示されてうざいので
$hoge=~ s/\\/¥/ig;
としようと考えたのですが、すると今度は特定の日本語文字が
化けてしまいます
$hogeの中の英数記号だけを変換するにはどう書いたらよいでしょうか
0861860
2009/08/14(金) 02:12:28ID:???$hoge=~ s/\\/&yen/ig;
です
0862nobodyさん
2009/08/14(金) 02:53:12ID:???0864nobodyさん
2009/08/14(金) 14:02:57ID:dh+Y7m4lバイトコードで書く
\5Cの次にS-JISの2バイト目が来なかった場合のみ置換
0866nobodyさん
2009/08/15(土) 03:55:15ID:???http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
0867nobodyさん
2009/08/15(土) 11:58:25ID:???肯定の戻り読みを使って、単語の後と行の先頭のときのみを置換するようにしたらどうだろう?
$hoge =~ s/((?<=^)|(?<=[\x00-\x7F\xA1-\xDF])|(?<=[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]))\\/¥/g;
0869nobodyさん
2009/08/16(日) 14:53:02ID:???0870nobodyさん
2009/08/16(日) 15:29:10ID:???use Data::Dumper;
print @Data::Dumper::EXPORT; #=>Dumper
パスを文字列にしてアクセスする場合は、シンボリックリファレンスにするしかないですかね?
my $path = "Data::Dumper";
print @{$path."::EXPORT"}; #=>Dumper
0871nobodyさん
2009/08/16(日) 21:22:55ID:???0873nobodyさん
2009/08/17(月) 00:52:26ID:PDEfAFzM0874nobodyさん
2009/08/17(月) 01:29:56ID:???0876nobodyさん
2009/08/17(月) 02:18:26ID:???{ package $path; print @EXPORT}
package で変数使えるならいけそうだけど使えなかった記憶が…
0877nobodyさん
2009/08/17(月) 07:59:43ID:???前に一度そういうコード書いたことあるからわかる
0878nobodyさん
2009/08/17(月) 09:09:05ID:QR35H0tn0879nobodyさん
2009/08/18(火) 00:44:13ID:jmGn/Iui中身が空で返ってきます。URLは間違ってないのですが、考えられる原因は何かないでしょうか?
0881nobodyさん
2009/08/18(火) 01:17:01ID:???取りあえずこの中身見てみては?
0882nobodyさん
2009/08/18(火) 02:57:59ID:B/cB/Ta10884nobodyさん
2009/08/18(火) 12:26:05ID:???ありがちなのはUserAgentとかRefererとかCookieとかトークンで弾かれてるってパターンだな。
0885nobodyさん
2009/08/18(火) 12:34:15ID:???0886879
2009/08/18(火) 13:44:36ID:9U61OqMGこれで良いのしょうか?
my $request = HTTP::Request->new('GET',$url);
my $http = $request -> as_string();
print "$http";
GET http://headlines.yahoo.co.jp/rss/indonews_c_int.xml User-Agent: libwww-perl/5.830
>>880
よく分からないのですがどういうことでしょうか
また、はじかれるのを回避するにはどうすれば良いのでしょうか?
0887nobodyさん
2009/08/18(火) 14:25:27ID:???http://headlines.yahoo.co.jp/rss/indonews_c_int.xmlが取得したいなら、
LWP附属のGETコマンドで一発で取れるからどっかスクリプトに不具合があるんじゃ
ないかと思われ。
0888nobodyさん
2009/08/18(火) 16:40:28ID:???my $url = "http://headlines.yahoo.co.jp/rss/indonews_c_int.xml";
my $file = "./rss.xml";
my $rc = getstore($url, $file);
is_success($rc) or die status_message($rc);
こっちはこれでアクセスできてるけど。
これがダメなら、一度LWPのパッケージのバージョン上げてみて、
それでもダメなら別の角度からどうぞ。
それ以前に、ブラウザでアクセスできてるんかいな。
0889879
2009/08/18(火) 18:56:58ID:2nsUhaJf最後の行でサーバエラーが出ました…
またブラウザでアクセスは出来ます。
あとアップデートはrootでrpm -Uvh perl-libwww-perlを行って出来ませんでした。
間違いを指摘して貰えると助かります。
0890nobodyさん
2009/08/18(火) 20:17:49ID:???依存関係でcpan使いたくないのなら、別に/usr/localにソースからPerl突っ込んでみるとか。
ここまで来るとlynxかwget使って取得した方が早そうだけど。
0891879
2009/08/18(火) 22:21:49ID:2nsUhaJfcpanでinstall LWPとした所、LWP is up to date(5.830)となりました。
0892nobodyさん
2009/08/19(水) 01:47:46ID:1hmn0Zu+0893nobodyさん
2009/08/19(水) 09:37:51ID:???rpmで削除できないか?できないなら@INCから自力でLPW探して
LPWを手動で削除してもっかいcpanから入れてみろ。
0895nobodyさん
2009/08/19(水) 18:15:22ID:???perl+htmlで掲示板を作っています。PC・携帯共に基本的には正常動作するのですが、auの機種のみ
■html側(shift_jis)
<form action="bbs.cgi" method="post">
<textarea name="comment" rows=4 cols=30></textarea>
<input type=submit value=発言>
</form>
↓「あいうえお」と入力
■bbs.cgi(EUC_JP)
use CGI;
$query = CGI->new;
@params = $query->param();
foreach $param (@params) {
$in{$param} = $query->param($param);
}
↓
$in{comment}の中身は「??????????」
のような動作になってしまいます。
URLエンコード/デコードのせいかと思ったのですが、受け取り時点でこんな化け方をされるとどうすれば良いのやら……
何か解決法は無いでしょうか。
よろしくお願いいたします。
0896nobodyさん
2009/08/19(水) 21:20:51ID:???0897nobodyさん
2009/08/19(水) 22:50:25ID:???携帯向けコンテンツはShift_JIS/UTF8のどっちかで作っとくことをお勧めしとく。
0898nobodyさん
2009/08/19(水) 23:39:59ID:1hmn0Zu+全部、UTF-8で作ったら?
0899nobodyさん
2009/08/19(水) 23:48:54ID:???$in{comment}の中身は、shift_jisコードで「あいうえお」なのだから、この中身をeucに変換する必要があるでしょ。
変換するとき自動にすると誤作動するから、my $str = Jcode->new($str, "sjis")->euc; などと元のコードを指定するべし。
あと、ページを出力するときにcontent-typeヘッダにcharsetを指定するべし。
0900nobodyさん
2009/08/20(木) 00:51:47ID:???0902nobodyさん
2009/08/20(木) 05:47:30ID:???今PATH_INFOの汚染チェックでヌルバイト(%00等)があれば消去という処理を
したいんですが、なぜかマッチしてくれません
$PATH = shift;
$PATH =~ s/(\0|\x00|%00)//g;
POSTやGETでは上記の処理で消すことが出来たんですが
PATH_INFOの場合はやり方が違うのでしょうか?
ちなみにタグのサニタイジングは出来ました
0903nobodyさん
2009/08/20(木) 08:42:44ID:???サニタイズ脳乙。
つーかapacheだとNULLは受け付けてくれないんだが(Not Foundになる)。
PATH_INFOを16進ダンプとかしてみた?
0904nobodyさん
2009/08/20(木) 09:14:03ID:???あー
だからPCからだと404に飛んだんだ
test.cgi/test/%00/aaa/
でPATH_INFOを表示させた場合
PC→404エラー
携帯(au)→/test/
となりました
16進ダンプ…調べてきます
0905nobodyさん
2009/08/20(木) 10:52:18ID:???見れるならサーバーのログもみとくといい。
クライアントが蹴って単にサーバーまで届いてない可能性もある。
0906895
2009/08/20(木) 11:42:27ID:???1.EUC-JPとShift_JISの判定問題が疑われるので、両方sjisに揃えてみる
→揃えても$in{comment}の中身は「??????????」で変わらず。この判定問題ではない?
Jcode変換しても全く変わらないので、そもそも「??????????」はshift_jisコードですらなさそう。
2.Encode Guessの使用
→両方sjisに揃えたうえで実行してみましたが、「??????????」はasciiコードとのこと。(「??????????」そのものになっている?)
UTF-8での作成も試してみようと思います。
これで出来なかったら素直にPHPに行ってくる……
0907nobodyさん
2009/08/20(木) 15:40:09ID:???0908nobodyさん
2009/08/20(木) 23:15:50ID:???Encode関連と見た。SJISだと「あいうえお」は全部MSBが立ってるから、
UTF-8ではマップできない。で、?に置換される。
MSBの立ってないのが混じってる「01234」で試してみ?
「?」以外の文字が混ざるようならビンゴだ。
>>897
今のUAでcharset=を解釈しないものとかHTMLの文字コードと送られてくる
文字コードが食い違うものって残ってる?
>>899
Encode使えよ
0910nobodyさん
2009/08/21(金) 00:09:36ID:???> ■bbs.cgi(EUC_JP)
を見て反応して、
> ■html側(shift_jis)
を見逃してた。
なるほどEncode.pm絡みか。
0911nobodyさん
2009/08/21(金) 00:15:52ID:???CGI.pmって
URLデコードが失敗すると?になったような
use CGI;
use URI::Escape;
print CGI::unescape( uri_escape( 'あいうえお' ) );
とかで試してダメならCGI.pmのバージョン上げてみるとか
0912Name_Not_Found
2009/08/21(金) 00:52:35ID:nWh8czvG肝心な質問ですが、
検索ボタンと一緒に付随しているコンボボックス?の事についてですが、何か1つコンボボックスの中の項目を選択して検索ボタンを押した後、その選択したコンボボックスを残した状態で検索結果を表示させたいです。
ただ検索ボタンとコンボボックスの領域は別のhtmlになっていて、検索結果を表示するCGI側で、その検索ボタンとコンボボックスがあるhtmlを読む込みようになっています。
前の検索項目を残すようにすることは可能でしょうか?
よろしくお願いします。
0913nobodyさん
2009/08/21(金) 01:17:05ID:???0914nobodyさん
2009/08/21(金) 03:36:54ID:kHQe2rHZ0915Name_Not_Found
2009/08/21(金) 09:53:12ID:nWh8czvG宜しければ、やり方を教えてください。
0916nobodyさん
2009/08/21(金) 10:34:03ID:???LWP の使い方はここを見ておけば、大概は困ることないよ
っていうサイトはありますか?
0917nobodyさん
2009/08/21(金) 10:43:59ID:???どこで聞いていいのかわからないので適切なスレがあれば誘導お願いいたします。
たとえば下記のようなディレクトリ環境をサーバに上げた場合、
a1以下全ての属性を777にしようとffftpのソフトでやると一つずつしか変更できないようでした。
そこでDOSプロンプトからftpで入り
quote site chmod 777 a1
としたところうまくいったので、下記のように再帰オプションをつけたところエラーになりました。
quote site chmod -R 777 a1
ヘルプをみると引数が2とあったので、ここでのchmodにはオプションが使えないのだと思います。
a1/
|---b1/
| |---text.txt
|---b2/
| |---c1
| |---text.txt
|---b3/
telnetなどがサポートされていないサーバなのですが、再帰処理ができるソフトやコマンドはありますでしょうか。
0918nobodyさん
2009/08/21(金) 12:04:28ID:???http://search.cpan.org/dist/libwww-perl/lwptut.pod
http://search.cpan.org/dist/libwww-perl/lwpcook.pod
>>917
△▲ WebProg 初心者の質問 Part19 ▼▽
http://pc11.2ch.net/test/read.cgi/php/1244038749/
0920nobodyさん
2009/08/21(金) 21:30:54ID:???まず html 側に独自タグを定義して、読み込んだときに置換すればいいかな
例えば
------- test.html -------
<form action="hoge.cgi" method="post">
<input name="nanka_no_flag" value="1"{checked} />
</form>
-------- test.cgi --------
$q = new CGI;
open FH, 'test.html';
print "Content-Type: text/html;\n\n";
while my $line(<FH>){
if($q->param('nanka_no_flag') == 1){
$line =~ s/{checked}/ checked="checked"/;
}
print $line;
}
こんな感じ?
ニュアンスが伝わればいいけど
あとはJavaScript使うとか
0921nobodyさん
2009/08/21(金) 21:32:25ID:???O <input type="radio" name="nanka_no_flag" value="1"{checked} />
orz
0922nobodyさん
2009/08/21(金) 22:04:09ID:???javascriptでセレクト値のクッキー食わせといて、javascriptで選択済みにするかぐらいか。
コンボボックスなら入力値を手入力できるだろうから、その辺もきちんと処理しないとね。
0923nobodyさん
2009/08/22(土) 01:27:58ID:R3OZ89h5そのshtmlページをサーバのロックでなくて、パスワードでアクセス制限したい。
なら素直に全部をトータルでcgi使えという声もあろうが、全部がスクリプトだと
レイアウト変更や更新が面倒。それに、一部iFrameなんかは楽だしね。
で、shtmlページを完全にアクセス制限する手はなんか内でスカイ?
0924nobodyさん
2009/08/22(土) 02:25:22ID:???0925Name_Not_Found
2009/08/22(土) 10:13:30ID:egsrQGCy早速それらの方法を真似て修正したいと思います。
またつまづいてしまったらきます。
ありがとうございました。
0926879
2009/08/22(土) 20:07:07ID:???何が原因でしょうか?今はもう無くなってしまったのでしょうか?
他のモジュールは通常通りインストールできます。
0928879
2009/08/23(日) 18:08:57ID:???他の許可してあるPCではis_successで成功するのですが、私のでは出来ません。
firefoxでプロキシなしでネットに繋ごうとすると繋がりません。
いろいろ試したのですがよく分からないので、考えられる原因を教えてください。
0929nobodyさん
2009/08/23(日) 18:14:27ID:???それってつまり、プロクシなしで正常に外部と通信出来てないってことじゃん。
それじゃあLWP云々の前に、そのPCで正常にアクセス出来るよう
設定見直すなり、会社(組織?)の管理者あたりに相談だな。
0930nobodyさん
2009/08/23(日) 18:16:42ID:???あぶねえ、同じようなこと投稿するところだったw
perlの問題じゃなさそうだし、直接そのPCを見ることのできる人に相談だろうな。
0931nobodyさん
2009/08/23(日) 19:12:32ID:dufUiF83コマンドプロンプトから
pingとtracerouteで接続状況を確認したら?
perlの問題じゃないと思ふ
0932nobodyさん
2009/08/24(月) 15:05:19ID:+a5IC9tF$aには1002が入ってて、$bには002001が入ってるはずだから、print "$a$b" ってすると1002002001となるはずが
1002
002001
と表示される、勝手に改行されている
chomp $aやchop $aしてみたけど、chompをやった結果は最初と変わらんし、chopをやると
100
002001
という結果になる
原因も対処法もわからない
ちなみに$a<>$bってやると
1002<>
002001
<>が上に来る不思議
0933nobodyさん
2009/08/24(月) 15:16:07ID:???パズルの問題でもつくっているのか?
変数毎に検証すれば何も難しくないと思うが。
$a = '1002';
$b = "\n002001";
これで、望み通りの結果だ。
print "$a$b"; # => 1002\n002001
print "$a<>$b"; # => 1002<>\n002001
chomp $a;
print "$a$b"; # => 1002\n002001
chop $a;
print "$a$b"; # => 100\n002001
0934nobodyさん
2009/08/24(月) 15:16:12ID:???変数にs/[\r\n\s]//g;を通してからprintしたら治ったり?
URI::Escape;してprint uri_escape($a,"\0-\377");とかして
変なコードはいってないか見てみたら?
0936nobodyさん
2009/08/24(月) 15:22:00ID:???「改行」は行の後につく、という固定観念なんだろう。
文字列というデータ列がターミナル上で「改行」として表示されている、
という概念に辿り着けていないんだろうな。
レス数が900を超えています。1000を超えると表示できなくなるよ。