Perlコーディング初心者質問スレ Part 40
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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:???共通の処理の方がかなり多いです。
うーんどんな例を出せば良いんだろう
0453nobodyさん
05/02/16 00:30:45ID:???enctype="multipart/form-data"としているのですが
一緒に文章を受信しようと
cgi-lib.plのReadParseで読んだデータを表示してみると
Content-Disposition: form-data; name="comment"
となっていて、フォームに入力した文字がありません
どうすれば一緒に受信できるのでしょうか?
0454nobodyさん
05/02/16 01:29:29ID:???正直、リファレンスで参照しろよと言いたいけど
どうしてもいやなら、こんなサブルーチンを作るといい!
sub deref{
for my $hash( @{ $_[1] } ){
%{ $hash } = %{ shift @{ $_[0] } };
}
};
testサブルーチンの戻値がハッシュのリファレンスのリストだとするとこうかける。
deref( [ test() ] => [ \%y1, \%y2, \%y3 ] );
または
deref( [ test() ] => [ \( %y1, %y2, %y3 ) ] );
0455nobodyさん
05/02/16 11:54:53ID:MwHh4jT0現在のページがSSLかどうかが入ってる環境変数はないのでしょうか?
0457nobodyさん
05/02/16 14:03:39ID:???そいつを、一行ずつ比較して同じなら削るPerl、、、
すまん、本職絵描きなんで誰か教えてくれ。
0458nobodyさん
05/02/16 14:21:03ID:???この配列の要素それぞれに2を足した数字を表示させたいです。
print map{return $_ + 2}@array;
としてみましたが、何も返されてませんでした;
どうにか変数などには入れず、@arrayの元々の値も変えずにできないでしょうか?
0459nobodyさん
05/02/16 14:21:20ID:???違う行にある場合は削らないの?
同じ行毎の比較のみ?
で、削るのは2つのファイル両方から削るの?
それとも二つのファイルから重複しないアドレスリストを求めたいわけ?
もちっと詳しく
0461nobodyさん
05/02/16 14:22:58ID:???マルチポストうざい。
http://pc5.2ch.net/test/read.cgi/hp/1106947416/177n
0462nobodyさん
05/02/16 14:26:26ID:???my @array = qw/1 2 3/;
print map{$_ + 2}@array;
print "\n";
print @array;
--result
345
123
0463458
05/02/16 14:26:45ID:???0464461
05/02/16 14:35:48ID:???0465458
05/02/16 14:37:22ID:???すいません;
これって
$hoge =~ s{}{}e;
これの右ブロックの中で使うにはどうすればいいですか?
$hoge =~ s{^([^\n]*)}{$1.
(join '',map〜).
"終端"
}e;
こんな感じで一応できましたがわざわざjoinしないといけないのがちょっと;
しかし強制的にスカラー評価されるところではこの方法以外にないのでしょうか?
0466458
05/02/16 14:43:22ID:???0468nobodyさん
05/02/16 14:58:35ID:???マルチ野郎はスルーしる
0469nobodyさん
05/02/16 20:09:14ID:???a1にあるXXX.plファイルをa2にあるPPP.cgiから
参照しようとしています。
PPP.cgiの中で
require "../a1/XXX.pl";
とするのは良いのでしょうか?
Copalだとエラーが出てしまいます。
0470nobodyさん
05/02/16 20:12:47ID:???$str =~ s/${value}/hoge/g;
をやるときに、$value の値に正規表現の制御文字(^$.[]…等)が
入っていると置換時にエラーとなってしまいます。
$value 内の文字をそのまま扱いたい場合はどのようにすればよいのでしょうか?
置換前に、$value の中の制御文字を全てエスケープするのかなと思いましたが、
他に簡単な方法があればご教授下さい。
0472nobodyさん
05/02/16 21:02:41ID:???ありがとうございます。
すみません、一つ忘れてました。。
$str =~ s/%__${value}\.begin__%(.+?)%__${value}\.end__%/hoge/g;
のような用途を予定しています。
\Q〜\E 内が全てエスケープされてしまうので、
本来使いたい正規表現が無効になってしまいますね…。
やはり変数個々に対してエスケープでしょうか。
0473472
05/02/16 21:24:45ID:???$str =~ s/%__${value}\.begin__%(.+?)%__${value}\.end__%/hoge/g;
を
$str =~ s/\Q%__${value}.begin__%\E(.+?)\Q%__${value}.end__%\E/hoge/g;
にすることで解決できたようです。(ホントに大丈夫かな…)
ありがとうございました。
0474nobodyさん
05/02/16 22:15:30ID:???0476nobodyさん
05/02/17 00:24:07ID:???0477nobodyさん
05/02/17 00:58:33ID:???0479nobodyさん
05/02/17 09:24:23ID:???@array = split(/,/,$hoge);
$array[1] = "hoge2";
$hoge = join(",",@array);
カンマで区切られた$hogeの指定個所を変更したいのですが、
今は上記のように、分割→変更→結合と3行に渡って行っています。
これをもっと効率の良い方法でやる事はできますでしょうか?
0480nobodyさん
05/02/17 10:40:36ID:ICaDRbeTprint "hoge\nhoge";
とやると、
hoge\nhoge
とそのまま表示されてしまうんですが、なにか間違いがあるんでしょうか。
0484nobodyさん
05/02/17 12:29:02ID:???0485nobodyさん
05/02/17 13:43:38ID:???この処理だけ100万回やるので全体の処理時間がここで決まるとかじゃなければ
あまり気にしてもしょうがないと思うが、
use Benchmark;
timethese(undef, {
SPLIT_JOIN => sub {
my $hoge = "hoge1,hoge1,hoge1,\n";
my @array = split(/,/,$hoge);
$array[1] = "hoge2";
$hoge = join(",",@array);
},
SUBSTITUTE => sub {
my $hoge = "hoge1,hoge1,hoge1,\n";
$hoge =~ s/,[^,]*/,hoge2/;
},
INDEX_SUBSTR => sub {
my $hoge = "hoge1,hoge1,hoge1,\n";
my $pos1 = index($hoge, ',')+1;
my $pos2 = index($hoge, ',', $pos1);
substr($hoge, $pos1, $pos2-$pos1) = 'hoge2';
},
});
Benchmark: running INDEX_SUBSTR, SPLIT_JOIN, SUBSTITUTE for at least 3 CPU seconds...
INDEX_SUBSTR: 3 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 222680.89/s (n=699218)
SPLIT_JOIN: 4 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 108552.56/s (n=338684)
SUBSTITUTE: 3 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 188749.53/s (n=602111)
0486nobodyさん
05/02/17 14:31:44ID:???ベンチマークまでありがとうです。
hoge2が計算式だったり、要素数が多かったりする事も考慮すると、
見易さの面(個々によると思いますが)でも、今まで通りでOKみたいですね。
(空想の関数/,/,$hoge)[99] = $age + $sage;
みたいな感じで$hogeをカンマで区切った場合、
要素100番目の位置にダイレクトに代入できる技が無いものかと思いまして。
0487nobodyさん
05/02/17 16:18:01ID:lgJIuLRQprint $a{a,b,c};
こういう感じでハッシュも配列みたいにいっぺんに呼べるカナと思いましたが、
エラーでした;
@a{a,b,c}や%a{a,b,c}もやりましたがダメでした。
ハッシュって
print $a{a},$a{b},$a{c};
のようにいちいち一つずつでしかできないのでしょうか?
0488nobodyさん
05/02/17 16:33:32ID:???@a{'a', 'b', 'c'}
0489nobodyさん
05/02/17 16:36:41ID:???使い道ないかもしんないけどこういうのも
0490487
05/02/17 16:43:51ID:lgJIuLRQクォートでしたか。
@a{qw/a b c/};
こんな感じですね^^
0491nobodyさん
05/02/17 16:56:59ID:???strict subsしているときは、サブルーチンとして
宣言されていない裸のワードの存在が許されるのは
「{}」の間に単独で存在するときと、「=>」の左側
だけ。
Bareword "a" not allowed while "strict subs" in use at ほげほげ
って感じのエラー出てたはずだからちゃんとよめよ...
エラーメッセージの意味わかんない人は、ラクダ本の
診断メッセージって章にアルファベット順に意味と並
べて書いてあるので調べる癖をつけましょう。
0492nobodyさん
05/02/17 18:15:10ID:???Apache 2.0.52
perl ActivePerl 5.8.6.811
クライアントの要求のヘッダを取得したいのですが出来るものでしょうか?
WEB サーバーからのヘッダは取得は出来たのですが、今やりたい内容ではないですし …
ご教授よろしくお願いします。
0494nobodyさん
05/02/18 01:51:05ID:???そうであればこんな正規表現があるけど
$hoge = "hoge1,hoge1,hoge1,\n";
$hoge =~ s/((?:[^,]*,){1})[^,]*/$1hoge2/;
これで前から2番目の「hoge1」が「hoge2」に置き換わる。
{1} の部分を
{0} とすれば先頭の「hoge1」が「hoge2」に置き換わるし
{2} とすれば前から3番目の「hoge1」が「hoge2」に置き換わる。
{3} とすれば最後のカンマの後ろに「hoge2」が追加(改行が置き換わる)されるし
4以上の数字を指定すと置換えは行われない。
カンマの数が増えれば置き換え対象の指定位置も増える。
0495nobodyさん
05/02/18 01:54:39ID:???(空想の関数/,/,$hoge)[99] = $age + $sage;
みたいにしたければ
$hoge =~ s/((?:[^,]*,){99})[^,]*/$1.($age + $sage)/e;
ってやればよい。
0496キヨ
05/02/18 04:51:35ID:wywZhzNy�@:やりたい事
データがカンマ区切り","されていない形式で、
データをソートして表示したい
4 平野 298 3
3 辻 286 5
2 秋山 325 26
1 清原 304 38
�A:やってみた事
各項目別にソートしたいのですが、
@mem = sort { (split(/\,/,$a))[0] <=> (split(/\,/,$b))[0] } @mem;
foreach $mem (@mem) {
($no,$name,$avr,$hr) = split(/\t/, $line);
(各処理)
}
現在、$noに関してソートして表示できています。
上記の[0]の部分を[2]に変更すると、$avr項目に関してソートできると思ったのですが
うまくいきません。
データの拡張子は.logですが、excelで開くと綺麗に並んで表示されます。
","で区切られていないと上記の処理は出来ませんか?
それとも、","の区切りは関係なく、別の問題なのでしょうか?
0497nobodyさん
05/02/18 05:26:56ID:qmmO8oMVモジュールに頼らずに入力されたパスフレーズをSHA1かけてファイルに保存しようと思ってます。
再配布可能でSHA1ハッシュ値を計算するサブルーチンをwebで検索したところ
ttp://www.mirrors.wiretapped.net/security/cryptography/algorithms/rc4/arcfour.pl
こちらでsha1サブルーチンがあったので、ちょっとここのサブルーチンを拝借して
$string = "ax";
print sha1($string);
という風にテストしてみたところSHA1ハッシュ値とは全然違う文字列が出力されました。
どのようにすればちゃんとしたSHA1ハッシュ値が得らるのでしょうか?
0498nobodyさん
05/02/18 05:36:15ID:???「データがカンマ区切り","されていない形式で」っていっているんだから
sort の中の split で","分割しちゃだめでしょ。
0499キヨ@496
05/02/18 06:50:20ID:wywZhzNy有り難うございます!
splitの\,を\tに変えたら作動しました!!
5〜6時間近く悩んでいたのに…。
本当にありがとう御座いました!!
0500486
05/02/18 08:42:07ID:4JcRNkuB親切な人ありがとー
一行でやるには関数では無くて、正規表現でやる事になるのですね。
勉強になりました。
0501nobodyさん
05/02/18 09:39:28ID:???SELECT * FROM TEST_TABLE;
これで全レコードのゼンフィールドを取得したとして。
@arrayの中に全レコードのhogeフィールドだけをデリファレンスして入れたい。
hogeフィールドは0番目だと仮定。
fetchall_arrayrefで返されるのが配列リファレンス。更に中に配列リファレンスなので
my @array = @{@{$sth->fetchall_arrayref}[0..$#{$sth->fetchall_arrayref}]}[0];
とかでいけるかと思いきやダメでしたorz
誰かわかる方いますか?
0502nobodyさん
05/02/18 09:48:08ID:???my $rows = $sth->fetchall_arrayref;
my @array = map { $_->[0] } @$rows;
0503501
05/02/18 10:21:48ID:???ありがとうございます。
変数作るの機雷なんで
my @array = map { $_->[0] } @{$sth->fetchall_arrayref};
としておきました。
もう一つお願いします。
sprintfで
$str = sprintf %d+100.%d-20.%d,@list;
こういう風に配列の中身にそれぞれ別の数字を足したり、文字列を付加したりしながらの
整形って不可能ですか?上記ではエラーでしたが;
やりたいことは
$str = $list[0]+100.$list[1]-20.$list[2];
です
0504nobodyさん
05/02/18 10:39:33ID:???0505504
05/02/18 10:47:26ID:dVwgIF/Dtruncate関数がダメならそれ以外で
open FH,"+<test.txt";
flock FH,2;
この状態のファイルの中身を一旦0にすることはできますか?
ファイルを上書きモ−ドで開くのは不可能です。このファイルを開いてる間に
処理内容が重複しては困ることをしてるので。
0506504
05/02/18 11:31:10ID:dVwgIF/D0508504
05/02/18 12:14:53ID:dVwgIF/D失敬な!
http://perl.misty.ne.jp/function02/truncate.html
http://www.7key.jp/program/perl/truncate.html
0509nobodyさん
05/02/18 12:16:49ID:???require './lib/lib1.pl';
--- lib1.pl ---
require './lib/lib2.pl';
open( FILE, "< file.txt" );
というファイル/ソースの時に、
original.pl を実行すると、
どこの file.txt, lib2.pl を読むのでしょうか?
この辺の位置関係を解説してるサイトがあれば
すみませんが教えてもらえると助かります。
0510nobodyさん
05/02/18 12:24:30ID:???■ このスレッドは過去ログ倉庫に格納されています