Perlコーディング初心者質問スレ Part 40
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0352nobodyさん
05/02/12 01:31:57ID:???演算子には()をつけないほうが読みやすいとされるそうです。
俺もそう思いますが、printは演算子です。
0353347
05/02/12 01:34:34ID:DEctNxAsなるほど〜、うまいことやる方法がきちんとあるのですね。
なんせCGIは初めてで正直まだ何もわかっていないんです。
でも351さんがおっしゃっていることは自分も同意で、普段書く時
は気をつけています、綺麗なコーディング。
とにかくがんばります。
0354347
05/02/12 01:40:35ID:DEctNxAsえ、、、PerlやPHPだとprintは演算子なんですかぁ、ちとびっくり。
てっきり関数かと思ってました。
だから()がいらないんですね、なるほどなるほど。
0355nobodyさん
05/02/12 03:35:24ID:W11W0gdqそもそもCGIでprint文なんていくつも書かないだろ。
出力用のルーチンに投げてprintは1つでお終い。そこで変数展開してやればいい。
0356nobodyさん
05/02/12 10:55:57ID:???0357nobodyさん
05/02/12 12:43:51ID:???正確に言うと少し違う。Perlの組み込み関数はある意味で全て演算子であるといえる。
>>356
それでいいよ。その方が分かりやすい。
0358s
05/02/12 16:09:49ID:???うまく読み取ってくれません。どうやればいいのでしょうか?
0360nobodyさん
05/02/12 17:35:59ID:???こら。好き勝手書くんじゃない。
0363nobodyさん
05/02/12 23:09:29ID:???0365nobodyさん
05/02/13 04:12:34ID:???print ←リスト演算子
scalar ←名前つき単行演算子
rand ←引数が一つの関数
sort ←関数
演算子はコンパイラが変換形式と答えを知っている。
関数はインタプリタにて処理が実行される。
0366nobodyさん
05/02/13 05:23:09ID:???例
82CA82E982DB
を
%82%CA%82%E9%82%DB
にしたいのです。
使われる文字はa-zA-Z0-9の半角英数です。
ちなみに漏れが考えたのは、2文字ごとにsplitで分割して配列に入れ、joinでくっつけて頭に%をくっつけるって方法だけど、これでいいっすか?
0370nobodyさん
05/02/13 12:40:44ID:NsfysfMzgoogleでperl http webなどとしてもURLのスキーマがヒットするので要領を得ないのです。
0371nobodyさん
05/02/13 14:54:56ID:???httpプロトコルを実装したモジュールなどいくらでもあるから
どういうものを探してるのかわからんが、LWPなどよく使うものなら
↓に少々載っている。
http://homepage3.nifty.com/hippo2000/perltips/index.htm
0373nobodyさん
05/02/13 16:50:52ID:Lwv6BlB8$a == 1 かつ $b == 2
みたいに条件にaかつbみたいな複数条件を付けるにはどう書いたらいいんでしょうか?
教えてエロイ人
0375nobodyさん
05/02/13 16:53:57ID:Lwv6BlB8即レスサンスコ
0376nobodyさん
05/02/13 20:33:35ID:???@xx=();とやってもだめでした。
for($i=0;$i<=$#xx;$i++){
$xx[$i]="";
}
↑こうすればできましたが、やっぱり一行で何とかなりませんか?
0377nobodyさん
05/02/13 21:00:28ID:???でできるけど。
0379nobodyさん
05/02/13 21:08:31ID:???@xx=()でだめということは、要素数を保ったままで全要素を
空文字列にしたいという問題なのかな?
もしそうなら、
map $_ = '', @xx;
$_ = '' for @xx;
for (@x) { $_='' }
あたりからお好きな奴を。下のほうに行くにしたがって
微妙に遅くなるけどそれほど差はない。map使う奴はvoid
コンテキストじゃないと遅くなるので注意。
空文字列じゃなくてundefでよければ、
@xx = ();
したあとに
$#xx = 要素数-1;
で要素数あわせる方が速いけど。
0380376
05/02/13 21:35:58ID:???0381nobodyさん
05/02/13 21:45:50ID:MAmE7PYm!~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/
なんかもうちょっといいのあったら教えてください
0382nobodyさん
05/02/13 22:24:52ID:???メールのアドレスはまじめにやるとかなりメンドウななので、
Email::Valid(または日本の携帯のRFCに違反したアドレスにも
対応したければEmail::Valid::Loose)を使うのが楽だよ、
というかすこしまえにこのスレで話題になってたぞ。せめて
現行のログぐらい読め。
ttp://search.cpan.org/~maurice/Email-Valid-0.15/
ttp://search.cpan.org/~miyagawa/Email-Valid-Loose-0.04/
0383nobodyさん
05/02/14 02:06:35ID:???$host = $1;
if ( !$host || !gethostbyname($host) ) {
print "不正なメールアドレスです";
}
俺はこうしてる。
0384nobodyさん
05/02/14 07:52:59ID:mZmBq9e/cト cト /^、_ノ | 、.__ つ (.__  ̄ ̄ ̄ ̄ ・ ・
,. -─- 、._ ,. -─v─- 、._ _
,. ‐'´ `‐、 __, ‐'´ ヽ, ‐''´~ `´ ̄`‐、
/ ヽ、_/)ノ ≦ ヽ‐'´ `‐、
/ / ̄~`'''‐- 、.._ ノ ≦ ≦ ヽ
i. /  ̄l 7 1 イ/l/|ヘ ヽヘ ≦ , ,ヘ 、 i
,!ヘ. / ‐- 、._ u |/ l |/ ! ! | ヾ ヾ ヽ_、l イ/l/|/ヽlヘト、 │
. |〃、!ミ: -─ゝ、 __ .l レ二ヽ、 、__∠´_ |/ | ! | | ヾ ヾヘト、 l
!_ヒ; L(.:)_ `ー'"〈:)_,` / riヽ_(:)_i '_(:)_/ ! ‐;-、 、__,._-─‐ヽ. ,.-'、
/`゙i u ´ ヽ ! !{ ,! ` ( } ' (:)〉 ´(.:)`i |//ニ !
_/:::::::! ,,..ゝ! ゙! ヽ ' .゙! 7  ̄ | トy'/
_,,. -‐ヘ::::::::::::::ヽ、 r'´~`''‐、 / !、 ‐=ニ⊃ /! `ヽ" u ;-‐i´
! \::::::::::::::ヽ `ー─ ' / ヽ ‐- / ヽ ` ̄二) /ヽト、
i、 \:::::::::::::::..、 ~" / ヽ.___,./ //ヽ、 ー
0385nobodyさん
05/02/14 09:45:44ID:IE9wtcnBカンマ区切りでダブルクォートで括られてると中のメタ文字は評価しないってやつです。
0386nobodyさん
05/02/14 10:26:10ID:???ここを見ながらファイル操作をためしてます。
しかし
open FH,"+>file";
こうした時に何故かファイルの既存データが読み取れません。
+<を使うと普通に読み取れますが、このサイトは間違った事を書いてるのでしょうか?
+>は読み取りも可能だと一覧表には書いてあるんですが・・・・
0388nobodyさん
05/02/14 10:48:19ID:???'+>'はファイルを開くときにまずいったん空にするのでそうなる。
そのあと新たに書き込んだ内容は読み出せるので読み取り可能と
いうのはそういう意味でいっていて間違いではない。
open(2)のflagsパラメタでいうと
'+>'はO_RDWR|O_CREAT|O_TRUNC
'+<'はO_RDWR
0390386
05/02/14 11:07:15ID:???そういうことでしたか!ありがとうござます。
ActivePerl5.6.1
Apache1.3
WindowsXP
この環境で今しがたflockのテスト行いました。flock初めてです;
open FH,"+<test.txt";
if (flock FH,2) {print "ok";}
seek FH,0,0;
print FH "あいうえお";
close FH;
>ok
okと出たのでflockがwinXPで使えるんだと思ってよいのでしょうか?
そうでしたら今から契約サーバでもこれを試して排他処理を選択しようかなと
思ってるんですが。
0391386
05/02/14 11:37:39ID:???+<の時もflockはモードを2にしておいていいんでしょうか?
読み込み時にモード2でやるとロックがかからない時があるようですが、
+<これはどうなのでしょうか?
0392nobodyさん
05/02/14 11:42:51ID:???flockは9x系では使えないけどNT系は使えるということになってたと
思った。未実装だと致命的エラーになるはずだし。
0393nobodyさん
05/02/14 11:57:52ID:???perlのflockがlockfやfcntlを用いたエミュレーションで実現されている場合は、
書き込みで開いてないとLOCK_EX使えないことがあるようだ。XpのActivePerlが
どうなのかは知らない。どちらにせよ'+<'は書き込み付だから問題ないと思う。
Note that the emulation built with lockf(3) doesn't provide
shared locks, and it requires that FILEHANDLE be open with
write intent. These are the semantics that lockf(3) imple-
ments. Most if not all systems implement lockf(3) in terms of
fcntl(2) locking, though, so the differing semantics shouldn't
bite too many people.
Note that the fcntl(2) emulation of flock(3) requires that
FILEHANDLE be open with read intent to use LOCK_SH and requires
that it be open with write intent to use LOCK_EX.
あと「モード2」とかって見づらいので、use Fcntl qw(:flock);して「LOCK_ほげ」
という名前の定数を使った方がいいと思う。
0395385
05/02/14 12:25:37ID:IE9wtcnBどうもです
0396nobodyさん
05/02/14 13:58:03ID:IE9wtcnBEmail::Valid::Loose
この二つを使いたいのですがwin版perl5.6にはプリインストールされてないようです。
そこでppmを使用してEmail::Validだけインストールしてみました。
しかしどうやらMail::Addressともう一つ何かが必要なようでMail::Addressの法を
ppmでインストールを試みてみたらどうやらPPDがないので無理なようですorz
実は今までppm以外のインストールをしたことがありません。
しかしこの度メールフォームを作成したいので、XSS対策?代わりにメルアドチェックを
Email::Validに任せたいのです。
多分鯖にもインストールされてないモジュールだと思うので、winXP環境の
ものをそのままLinux鯖のユーザスペースに移して使おうと思ってます。
0397nobodyさん
05/02/14 14:00:26ID:IE9wtcnBしかしその場合はLinux上にコピーしたところで使用するのは不可能ですよね?
Email::Valid
Email::Valid::Loose
使用してる皆様アドバイスお願いします。
0398nobodyさん
05/02/14 14:13:07ID:???Email::Valid::Looseはperlだけで書かれているっぽいので、
コピーすればいけるんじゃないかな。
ちゃんとディレクトリを掘ったりuse lib追加したりは必要
だろうけど。
しかしLinuxなら普通の手順でインスコできそうなもんだが
貸し鯖かなんかですかね。
0399396
05/02/14 14:24:17ID:IE9wtcnBEmail::Valid::Looseは
Email::Validのサブクラスですよね?
Email::Valid自体もpureperlなんでしょうか?
実は私は中身を見てもそれがpureperlなのかどうか判断できない馬鹿者なんですorz
実際の実行はLinuxのレンサバですが、テスト環境がwinXPなのです。
以前にpureperlのモジュールをLinuxレンサバのユーザスペースに移して
使用したことはあるので、今回もpureperlならできると思いますが、
結局Mail::addressとNet::DNSモジュールあるいはnslookupが必要なので
むりぽですorz
行き詰ってるのでとりあえずソースを自分でコンパイルしてインストールする
方法を勉強してみます。
0400nobodyさん
05/02/14 14:36:52ID:???開発手元に持ったほうがいいよ。
俺はデスクトップ環境にはLAN上にRH9置いてる。
持って歩くノートにはWinXPをホストにしてcolinux+debianを使ってる。
perlモジュールはCPAN使ってインストしてる。
実機はレンサバだけどSSHできるのでCPANで ~/lib/perl5 とかにインストして use lib〜使ってる。
環境作るの少々めんどいけど、都度Win環境でごたごたするよりはまし。
マシンなければ colinux+debian(デストリは何でもいいけど)で、これ最強。
0401nobodyさん
05/02/14 14:40:17ID:???あまり知識がないなら簡単なチェックで我慢したら?
@.-_
確かこれ以外の記号を使ってるメールアドレスってないよ。
だからこれと英数字以外を含んでるなら「メルアドが不正!」みたいな
メッセージを出してメールフォーム画面に戻せばとりあえず問題ないけどね。
まともなメールフォームなら
"<>スペース
あたりも許容するべきだけど、まあないならないでいんじゃないかな?
0402nobodyさん
05/02/14 14:49:16ID:???Net::DNSまたはnslookupが必要になるのはmxcheckを有効にしたときで、
無効にしとけばいらないはず。
0403396
05/02/14 14:52:18ID:IE9wtcnBcolinux+debian
聞いたことない名前ですが調べてみますm(_ _)m
>環境作るの少々めんどいけど、都度Win環境でごたごたするよりはまし。
そうですよねorz
>>401
そうなのですか!?
メールフォームといっても相手していするアドレスに固定文章を送りつけるだけなので
メールフォームとは呼ばないのかもしれません^^;
>@.-_
でもrfc882か何かではサイトURLなどと同じ記号が許されてましたよね。
で、それが結構な数になりますが私も401さんが挙げてくれた記号以外を
使ったメールアドレスを見たことがありません。
でもちょっと不安です;
どなたか @.-_ この4種類以外の記号が使われてるメールアドレスを
見たことがある方はいますでしょうか?
0405nobodyさん
05/02/14 15:23:42ID:???別の世界のメールシステム(多いのはLotus)に中継される場合なんかで
hoge/fuga/[email protected]
みたいのはよく見ますね。hoge/fuga/gagaは適当に分解されて
向こうの世界のユーザ名やドメイン名みたいなものになるらしい。
あと+=?あたりは普通に名前の一部として使ってるのをたまにみるかな。
404が紹介した顔文字アドレスはさすがにまだ見たことないです(笑)
0406396
05/02/14 15:27:00ID:IE9wtcnBおお!これはありがとうございます!
つまり自前サーバ立ててる人以外は大丈夫ということですね。
自前サーバ立ててる人はきっと私より知識が豊富なので説明もしやすそうですし。
さっき他のサイトを色々見てたらみなさんけっこうrfc準拠アドレスでも
@_.-以外を含んでる拒否するんですね。
とりあえず現状はこれでよしとして、なるべく早くEmail::validにイコウシマス!
0407nobodyさん
05/02/14 16:25:33ID:???みたいな無名ハッシュリファレンスを引数にしますが、これってメソド側でどうやって
受け取るんでしたっけ?
sub test{
$a = shift;
$b = shift;
ここでどうやればいいのか忘れてしまいました。誰か知ってますか?
0408nobodyさん
05/02/14 18:51:18ID:M2nRDwE8バイト単位で返すようにすると1,000という風にカンマ区切りが入ってしまうのです。
具体的には<!--#include virtual="filesize.cgi?file=パス"-->として自動的にページに
?fileクエリで指定したファイルのサイズを区切りなしのバイト単位で出力したいのです。
<!--#include virtual="filesize.cgi?file=/test/test.jpg"-->バイト
1000バイト
どなたかどのように書けばよいのか分かりませんか?
0409nobodyさん
05/02/14 19:01:43ID:sFNZsuc6最新情報
0411nobodyさん
05/02/14 20:27:00ID:???好きなのどうぞ
test1({a => 1 , b => 2});
test2({a => 1 , b => 2});
test3({a => 1 , b => 2});
test4({a => 1 , b => 2});
sub test1{
my %z = %{shift()};
print map{"$_ => $z{$_}\n"}keys %z;
}
sub test2{
my %z = %{+shift};
print map{"$_ => $z{$_}\n"}keys %z;
}
sub test3{
my $z = shift;
my %z = %$z;
print map{"$_ => $z{$_}\n"}keys %z;
}
sub test4{
my $z = shift;
print map{"$_ => $z->{$_}\n"}keys %$z;
}
0413nobodyさん
05/02/14 21:34:32ID:azOG+8a2MCPANでImage::Magickモジュールを入れようとしましたが、エラーになってしまいました。
そこで、ついforce installをしてしまいました。その結果か、入っていないにもかかわらず、
MCPANではImage::Magick is up to dateと表示されてしまうようになりました。
現状どおり、Image::Magickが入っていないと表示されるようにするには、どのようにしたら
良いのでしょうか。よろしくお願いします。
0414nobodyさん
05/02/15 00:00:01ID:???uninstallしろよ。
できなきゃOSから再インストールしろ。
自己責任でforce installなんかやったんだろ。
ついでにスレ違いだ。
Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/
0415nobodyさん
05/02/15 08:40:45ID:6J2om7eC数字アルファベット以外のすべての文字に
\をつけるにはどうすればいいんでしょうか
$hoge=~s/([^0-9a-zA-Z])/(?:\\)\1/g;
とかやってもうまくいきません
0417nobodyさん
05/02/15 09:38:39ID:???&hoge(%hash);
こうすればリスト形式で渡りますよね?
sub hoge{
my %hash = (@_);
こうすればハッシュが壊れることはないでしょうか?とりあえずテストは成功しましたが、
私の知らないおかしなことが起こる瞬間があると怖いです。
0419417
05/02/15 09:56:56ID:???リファレンスにするとルーチンで作らせたハッシュは全てリファレンスになり
出力整形時に
->
が大量に出てくるので嫌なのです;
0420nobodyさん
05/02/15 10:25:40ID:???0421417
05/02/15 10:34:23ID:???そういうことなのですか?^^;
例えばルーチンが複数のハッシュリファレンスオブジェクトを返してくるとします。
その時に受け取り側でデリファレンスしながら受け取ることっでできませんか?
1個なら
my %hash = %{[&method]};
でいいですが返り血がだと、あ、
my %hash = %{[(&method)[0]]};
my %hash2 = %{[(&method)[1]]};
とすればいいのかな?
0422nobodyさん
05/02/15 10:58:14ID:???$a = $b;
$b = $c;
$aと$bを入れ替える関数ってなかったでしたっけ?
0423nobodyさん
05/02/15 11:42:03ID:???又、どちらかを意識的に呼び出すにはどうすればいいでしょうか?
0426nobodyさん
05/02/15 12:08:39ID:kdpe8a8eおー!せんきゅー、ぶらざー
0427nobodyさん
05/02/15 12:16:30ID:???my %hash = %{[shift]} ;
}
shiftにはハッシュロファレンスが入ってますが、デリファレンスできないのでしょうか?
0428nobodyさん
05/02/15 12:21:04ID:5Ng5Me3b時々コンパイルできなくなってしまうのですが
0431nobodyさん
05/02/15 13:27:42ID:???それはなぜかではない。%{[shift]}がだめなのは
shiftでとりだした値(たぶんハッシュのリファレンス)
ひとつからなる無名配列を作ってそのリファレンスを
%{}でハッシュとしてデリファレンスするという無理
なことをしているから。
[]とか%{}の意味わbゥってないんじb...
0433nobodyさん
05/02/15 14:19:09ID:???試せば直ぐにわかることだが、レキシカル変数が優先される。
グローバル変数を参照するにはパッケージ名で修飾すればいいが、
グローバル変数とレキシカル変数に同じ名前をつけるのは奨励できない。
>>428
PerlのrequireはPHPのrequire_onceに相当する。
0434nobodyさん
05/02/15 14:48:48ID:dZXRK/qgDBI::db=HASH(0x1a51d38)->disconnect invalidates 1 active
statement handle (either destroy statement handles or call
finish on them before disconnecting) at
ファイル名 line 231.\n
こういうエラーがでました。
apacheのエラーログです。
どうやら$dbh->disconnect辺りが問題点らしいですがどういうことなのでしょうか?
一応mysqlにDBIで接続してinsert構文の発行などはできています。
画面上もエラーがでません。
しかし何故かログにはエラーとして残るようです。
どなたかわかる方いませんか?
0435434
05/02/15 14:50:57ID:dZXRK/qg$sth->finishがなかったせいでした。
しかしmysqlには不要なはずなんですがね;
disconnectも本来不要だから使うならfinishもしっかり使えとかいう感じですかね。
とりあえずすみません解決です。
0436428
05/02/15 15:09:22ID:5Ng5Me3b有難うございました
0437nobodyさん
05/02/15 19:48:45ID:sBhWNNlk2: my $image = new GD::Image(640, 480);
$image->Scale(width=>320,height=>240);
と
my $image = new GD::Image(640, 480);
my $image2 = Image::Magick->new;
$image2->Read($iamge);
3: 500 Internal Server Error
GDで画像を製作し、Image::Magickで縮小などの加工を行いたいと思っています。
(GDで縮小するとアンチエイリアズがかからず汚くなるのと、その他の加工も行いたいので、Image::Magickを使っています)
現在は、GDで製作した画像を中間ファイルに出力した後、Image::Magickで中間ファイルを読み込んでいるのですが、
中間ファイルを使わずに、GDからImage::Magickへ直接画像データを渡すことはできないのでしょうか?
0438nobodyさん
05/02/15 19:51:25ID:FRNIfDdjオフラインでperlで作成したcgiを作成した場合で、cgiにパラメータを引き継がせたい場合
どのように起動すればいいのでしょうか?
./exsampl.cgi?a=abc
0440nobodyさん
05/02/15 19:57:05ID:???--exsampl.cgi
#!/usr/local/bin/perl
print "$ARGV[0]\n";
$ ./exsampl.cgi aho?
0441T女の竹田
05/02/15 21:07:10ID:???このへんのことかな?
http://www.att.or.jp/perl/cgi-debug-env/deb-tech.html
QUERY_STRINGがQUERY_STRINGSになってるのは罠なので気をつけて。
WindowsならSET文ね。
SET "QUERY_STRING=item=hoge&item2=moge"
って感じ。
0442T女の竹田
05/02/15 21:11:17ID:???0443nobodyさん
05/02/15 22:05:37ID:???0444nobodyさん
05/02/15 22:26:13ID:ilxRQfx7ある関数内で必要な引数の数が、関数内の処理によって異なる場合、次のような方法はアリですか?
&hoge("2ch");
&hoge(["yahoo", "損", "氏ね"]);
sub hoge {
my($kind) = shift;
if($kind eq "2ch"){
print qq(オマエモナー);
}elsif($$kind[0] eq "yahoo"){
print qq(とりあえず$$kind[1]$$kind[2]);
}
}
きれいに書くにはどう言う方法を取ったら良いのでしょうか。
0445nobodyさん
05/02/15 22:34:23ID:???0447nobodyさん
05/02/15 22:49:03ID:???0448nobodyさん
05/02/15 22:57:13ID:???引数が複数の時には無名配列にしてる意味はなに?
引数の数で処理を分けるなら、
scalar @_ の数を見ればいいんじゃないの?
0449447
05/02/15 23:00:54ID:???&hoge("yahoo", "損", "氏ね");
sub hoge($;@){
unless( $_[1] ){
print "オマエモナー\n";
}else{
print "@_\n";
}
}
じゃ、ダメかい?
0450T女の竹田
05/02/15 23:13:38ID:???どのくらい共通でどのくらい共通じゃないか、
もうちょっとわかりやすい例にならない?
>>444では共通の処理がないからピンと来ないよ。
0451444
05/02/15 23:43:31ID:???共通の処理の方がかなり多いです。
うーんどんな例を出せば良いんだろう
■ このスレッドは過去ログ倉庫に格納されています