Perlについての質問箱 28箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/31(火) 14:52:21"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2006/10/31現在の最新版: 5.8.8
● 2006/10/31現在の開発版: 5.9.3
前スレ
Perlについての質問箱 27箱目
http://pc8.2ch.net/test/read.cgi/tech/1157874614/
リンク集は>>2-3
過去スレは>>4
0175デフォルトの名無しさん
2006/11/11(土) 13:27:03普通にできると思うけど。
そもそもサブルーチンなしなら出来ているという確認はしたの?
サブルーチンなしでも出来ない、別の問題というオチじゃ
0176岐山面
2006/11/11(土) 13:33:19残念だがPerlで文字列と数字では変数型の区別がないです。できるのは、ある文字列は有効な数字の表現かどうかだけです。たとえば、ある文字列に対するいろんな判別方法は(→Perl Cookbook)
warn "has nondigits" if /\D/;
warn "not a natural number" unless /^\d+$/; # rejects -3
warn "not an integer" unless /^-?\d+$/; # rejects +3
warn "not an integer" unless /^[+-]?\d+$/;
warn "not a decimal number" unless /^-?\d+\.?\d*$/; # rejects .2
warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/;
warn "not a C float"
unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
0177デフォルトの名無しさん
2006/11/11(土) 13:36:09>>174の言うとおり、内部では区別なし。
次の質問は「数値として適切な文字列を判定する方法は?」
と「値を数値と解釈したい(or そのまま文字列として解釈したい)」
が予想されるが。。。
前者の簡単な判断は $val =~ /¥D/ なら数値以外が含まれていることになる。
が、小数点や符号や浮動小数点を考慮するともう少し複雑になる。
後者は、「$val + 0」で数値として扱われる。
算術演算子で扱わなければ文字列として扱われるが、「$val . ""」で文字列として扱われる。
0178デフォルトの名無しさん
2006/11/11(土) 13:55:33ttp://www.nikkei.co.jp/news/past/honbun.cfm?i=AT1G10035%2010112006&g=K1&d=20061110
0179デフォルトの名無しさん
2006/11/11(土) 14:15:440180デフォルトの名無しさん
2006/11/11(土) 14:17:480181デフォルトの名無しさん
2006/11/11(土) 14:27:04>>176
>>177
レスありがとうございます。$val + 0で期待通りの動作に出来ました。
0182デフォルトの名無しさん
2006/11/11(土) 16:46:580183岐山面
2006/11/11(土) 17:01:140184182
2006/11/11(土) 17:16:49DBD::mysqlについてです。
0185岐山面
2006/11/11(土) 17:27:390186デフォルトの名無しさん
2006/11/11(土) 17:47:07基本は
$ perl Makefile.PL
$ make
$ make test
$ make install (ここは root 権限で)
なので、一度やってみ。
0187182
2006/11/11(土) 18:19:05ありがとうございます。
書いて下さった手順は一通りやっていて、make test で一つだけエラーが出ています。
t/40bindparam........FAILED test 23
Failed 1/28 tests, 96.43% okay
この状態でとりあえずインストールまでやって、MovableType3.3を動かそうとしていますが、
mt.cgiで下のようなエラーを吐いています。
Got an error: install_driver(mysql) failed: Can't load '/usr/local/lib/perl5/site_perl/5.8.7/i86pc-solaris/auto/DBD/mysql/mysql.so' \
for module DBD::mysql: ld.so.1: perl: fatal: /usr/sfw/lib/libgcc_s.so.1/libmysqlclient.so.15: Not a directory at /usr/local/lib/perl5/5.8.7/i86pc-solaris/DynaLoader.pm line 230.
at (eval 9) line 3
Compilation failed in require at (eval 9) line 3.
Perhaps a required shared library or dll isn't installed where expected
at lib/MT/ObjectDriver/DBI/mysql.pm line 96
"/usr/sfw/lib/libgcc_s.so.1/libmysqlclient.so.15"というパスは存在していない(libgcc_s.so.1はディレクトリじゃない)
ので、ここがネックなのかな、と思っていますが、どこの設定の結果ここを見に行っているのか把握できないので、
どうかご教授お願いします。
0188デフォルトの名無しさん
2006/11/11(土) 18:57:39オラわかんね。
ちなみに、Solarisに二つperlが入ってるってことはないよね?
/usr/bin/perl と /usr/local/bin/perl があって、DBD のインストール対象と mt.cgi が
使ってるものが違うとか。ハズしてたらめんご。
0189デフォルトの名無しさん
2006/11/11(土) 19:15:10こんなの見つけたよう。
http://dev.mysql.com/doc/refman/4.1/ja/perl-support-problems.html
0190182
2006/11/11(土) 19:48:11>>188
難しいですよね(´・ω・`)
デフォルトで入っていたものは退避させていて、新しい方を見に行くように設定しています。
>>189
わざわざありがとうございます。
しかし、書いてあるような"-static -config"ってオプションはないみたいなんですよ。
バージョン5系を使っているので、無くなっちゃったんですかね。。。
0191182
2006/11/11(土) 19:56:39LD_LIBRARY_PATHにもLDFLAGSにも/usr/libを通しているんですけどね。。。
困りました(^_^;)
0192デフォルトの名無しさん
2006/11/11(土) 21:23:54http://perldoc.jp/docs/modules/DBD-mysql-2.1026/DBD/mysql/INSTALL.pod
内の「既知の問題」の 3. がそれっぽい気がします。
mysqlclient.so では動作せず、スタティックリンクが必要なシステムがあるということのようです。
僕もようわからんので、追加情報 & 経過報告よろしく。
0193デフォルトの名無しさん
2006/11/11(土) 22:07:08問題の切り分けとして。
シンプルなテストプログラムですら動かない?
use DBI;
$dbh = DBI->connect('DBI:mysql:dbxxx:hostxxx', 'userxxx', 'passxxx');
くらいでもいいと思うけど。
0194182
2006/11/11(土) 22:08:44ありがとうございます。
libmysqlclient.so周りがあやしい、っていうのは前出のと同じ感じなんですね。
オプションの指定の仕方がハッキリとは書いてない感じなので、いろいろ試してみます。
・libmysqlclient.aを/usr/libにコピー→変わりなし
# 明示的に指定しないとダメなんですね(^_^;)
・mysql_config --libsの結果をコピーして、mysqlclient部分をlibmysqlclient.a
のフルパスに書き換え、貼り付け→オプションエラー
0195デフォルトの名無しさん
2006/11/11(土) 22:34:17Perl/Tk使うとか?
あるいはWin32::GUI::Loftとか。
0196182
2006/11/11(土) 23:35:48一行目にperlパス追加したCGIにして実行しましたが、下のようになりました。
Name "main::dbh" used only once: possible typo at CGIファイルのパス line 3.
194の最後に書いた方法、ダブルクオートで囲むのを忘れていましたorz
しかし、それでやるとmake testでほぼ全滅になり、余計ダメみたいでした(;つД`)
0197デフォルトの名無しさん
2006/11/12(日) 00:10:31>一行目にperlパス追加した
もしかして perl に -w オプション付けてる? だったら -w 外すか、
my $dbh = ..
にしてみて。動いてるような気がする、のはらたいらに3000点
0199デフォルトの名無しさん
2006/11/12(日) 00:52:17ということは、最低限DBに接続できていると言うことになるんじゃ?
試しにパスワードとかデタラメにしてエラーが出るように変わるか確認すればいいよね。
ということは、DBDのインストール成功(make testの影響はわからないが)。
じゃ、mt.cgi は何でよ、ってのはわからんけど。
0200182
2006/11/12(日) 01:14:38ユーザ、パスワードイジったらコネクションできなかったので何らかの形にはなってる、ってことですね。
MTのモジュールチェック用CGIでもインストールされている、という表示は出ています。
ますます原因がわからなくなってきましたね(´・ω・`)
0201デフォルトの名無しさん
2006/11/12(日) 01:15:550202デフォルトの名無しさん
2006/11/12(日) 01:20:110203デフォルトの名無しさん
2006/11/12(日) 01:39:380204デフォルトの名無しさん
2006/11/12(日) 02:23:33Devel::Trace
0205デフォルトの名無しさん
2006/11/12(日) 07:43:340206デフォルトの名無しさん
2006/11/12(日) 08:29:10print "hoge\n";
}
これを簡略化して
if ($str eq ('ほげ' || 'ふが' || 'もが')) {
print "hoge\n";
}
としたのですが、うまくいきませんでした。
簡単に書ける方法があったら教えてください。
0207デフォルトの名無しさん
2006/11/12(日) 08:45:03ただし ほげ ふが もが にマルチバイト文字や記号が入る時は
\Q と \E で囲わないと、ダメな場合がある。 >>82-84 辺りを参照。
0208デフォルトの名無しさん
2006/11/12(日) 08:51:31print "hoge\n" if grep {$str eq $_} ('ほげ', 'ふが', 'もが')
0209206
2006/11/12(日) 10:10:14なるほどお
正規表現を使うことは全く頭にありませんでした。
ひとつ知恵が付きました。
>>208
grep関数、知らなかったので調べてみました。
これ便利ですね。
>>207-208
おかげで解決しました。
レスありがとうございました。
0210デフォルトの名無しさん
2006/11/12(日) 11:17:00まあ、そこまでするくらいなら普通に比較した方が楽だとは思うけど
比較文字列に何らかの修正を加える場合なら一考の余地ありかと思う。
大文字小文字を区別しないとか、半角カナ・全角カタカナ・ひらがなを区別しないとか。
0211デフォルトの名無しさん
2006/11/12(日) 11:37:24解決隅にレスるのもなんだが誰も指摘しないので一応書いとく。
my $str = 'bar' ;
if ( $str eq 'fuga' || 'hoge' || 'bar' ){ print 'hoge' . "\n" ; }
0212デフォルトの名無しさん
2006/11/12(日) 11:39:120213デフォルトの名無しさん
2006/11/12(日) 13:03:46君がperlを愛しているからさ
0214デフォルトの名無しさん
2006/11/12(日) 13:34:15一応こういうものもある。
Perl6では言語機能として提供されるようだね。
0215デフォルトの名無しさん
2006/11/12(日) 18:21:48手動でバイナリエディタから削除したものとPerlスクリプトでのものが同一になりません
すみませんがアドバイスを頂けないでしょうか
open (IN,"hoge");
open (OUT, ">hogehoge");
binmode IN;
binmode OUT;
@bin = <IN>;
$binout = "";
foreach $bin(@bin){
$binout .= unpack("H*", $bin);
}
$bin2 = substr($binout,32);
print OUT pack("H*",$bin2);
close (IN);
close (OUT);
こんな感じでスクリプトを書いてみたのですが…
ちなみに substr の所をコメントアウトして unpack したものをそのまま pack したところ
同一のファイルが出力されることは確認してます
0216182
2006/11/12(日) 18:26:45環境変数LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/(mysqlのインストール先ディレクトリの、ライブラリがある場所)がないと
>>193さんのテストスクリプトも動かなくなります。
逆に、追加してあるとコマンドライン上でmt.cgiもエラーを吐かなくなります。
ブラウザ上では相変わらずなので、見に行くライブラリの指定が足りない状態でインストールされてる、ってことなんでしょうかね。。。
0217デフォルトの名無しさん
2006/11/12(日) 18:26:54置換等の作業もするので16進ダンプを使用したいのです
最初の確認で躓き…orz
0218182
2006/11/12(日) 18:36:26コマンドライン上だと下のような実行結果になる、ということです。
LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/がない
test.cgi => ×
mt.cgi => ×
LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/がある
test.cgi => ○
mt.cgi => ○
↓出力内容
Status: 302 Moved
Pragma: no-cache
Location: http://設置WebサイトURL/MTのディレクトリ/mt-upgrade.cgi?__mode=install
0219デフォルトの名無しさん
2006/11/12(日) 18:56:49なるほど、LD_LIBRARY_PATH の問題だったか。
じゃあ、httpd にも LD_LIBRARY_PATH を設定すれば解決するんじゃないかな。
Solarisではどのように httpd 起動してるんだっけな。
/etc/init.d/httpd あたりだっけ? そこで追記するか、そこから apachectl を
呼び出しているなら apachectl へ追記するか。で、httpd を再起動。
スレ違いになっちゃったけどね。
0220215
2006/11/12(日) 20:20:29同一の方法で抽出からやり直したところ、ちゃんと想定通りの結果になりました。
スレ汚し申し訳ない…
0221182
2006/11/12(日) 22:33:06ありがとうございます、ようやく解決できました。
やはりApacheにLD_LIBRARY_PATHを持たせる、というのでOKでした。
ApacheのconfファイルにデフォルトでLD_LIBRARY_PATHをset envするオプションがついていて、
そこに"/usr/sfw/lib/libgcc_s.so.1"が記述されていたので、libmysqlclientをそこに見に行って、
>>187のエラーになっていたようです。
ホントにスレ違いでしたが、ありがとうございました!
0222デフォルトの名無しさん
2006/11/12(日) 23:57:14ファイル全てを一つの文字列としてスカラー変数に入れたいのですが、
どう書くのが適切かつコンパクトですか。
0223デフォルトの名無しさん
2006/11/12(日) 23:58:44use File::Slurp;
my $text = read_file('filename');
0224デフォルトの名無しさん
2006/11/13(月) 00:05:10ありがとうございます。それ調べてみます。
ちなみに、モジュールを使わないケースではどうなりますか?
0225デフォルトの名無しさん
2006/11/13(月) 00:12:090226デフォルトの名無しさん
2006/11/13(月) 00:12:12{
local( $/, *FH ) ;
open( FH, $file ) or die "sudden flaming death\n"
$text = <FH>
}
[2]
local( *FH ) ;
open( FH, $file ) or die "sudden flaming death\n"
my $text = do { local( $/ ) ; <FH> } ;
[3]
{
local( $/ ) ;
open( my $fh, $file ) or die "sudden flaming death\n"
$text = <$fh>
}
[4]
open( my $fh, $file ) or die "sudden flaming death\n"
my $text = do { local( $/ ) ; <$fh> } ;
[5]
my $text = do { local( @ARGV, $/ ) = $file ; <> } ;
0227222
2006/11/13(月) 00:28:11と、取り敢えず安全性?なんたるものか調べます。
0228さくら
2006/11/13(月) 00:51:29「画面上に(kterm)に「last
proxy 」と二つのメニュー(それぞれプログラム
名)を表示させ、lastをクリックして選べばlastコマンドの出力から、
自分(0123456)がログインした回数を数える(他のユーザーは数えない)
サブルーチンが実行される。
またproxyを選べば、proxyのログから、ある今までにもっともサイト
にアクセスした時間帯を表示するサブルーチンが実行される。」
というプログラムを組みたいのです。proxyはどんな解析がいいか、
いろいろ考え中でしたが一例として述べました。。。どなたか、アドバイス等
お願いします!!!!
0229デフォルトの名無しさん
2006/11/13(月) 01:14:14日本語でおq
0230デフォルトの名無しさん
2006/11/13(月) 01:29:33これは完全に文系向けのものだな
厳密でない
基本的に1次元のデータが基本
列操作、多次元操作がまともにできないってどんなくそ言語だよ・・・
fortran90から移行したが
それととくらべると
とんでもないだめ言語だな
perlは
0231デフォルトの名無しさん
2006/11/13(月) 01:32:20その通りだな!! 時間の無駄だから、さっさとPerlのことは忘れた方がいい。
がんばってくれ。
0232デフォルトの名無しさん
2006/11/13(月) 01:36:55アドバイスとしては、ちゃんと読み書きの勉強して、色々な本を読もうね、ってとこかな。
0233デフォルトの名無しさん
2006/11/13(月) 04:40:51下記が今使っているコードですが、これをもっとスマートに書く方法があれば教えてください。
$number1 = 8;
$number2 = 3;
$number3 = 4;
if (($number1 < $number2) && ($number1 < $number3)) {
print "\$number1が一番小さいです。\n";
} elsif (($number2 < $number1) && ($number2 < $number3)) {
print "\$number2が一番小さいです。\n";
} elsif (($number3 < $number1) && ($number3 < $number2)) {
print "\$number3が一番小さいです。\n";
}
0234233
2006/11/13(月) 04:49:04訂正します。
if (($number1 <= $number2) && ($number1 <= $number3)) {
print "\$number1が一番小さいです。\n";
} elsif (($number2 <= $number1) && ($number2 <= $number3)) {
print "\$number2が一番小さいです。\n";
} elsif (($number3 <= $number1) && ($number3 <= $number2)) {
print "\$number3が一番小さいです。\n";
}
0235デフォルトの名無しさん
2006/11/13(月) 07:10:09贅沢な方法ではsortする手があります。
0236デフォルトの名無しさん
2006/11/13(月) 09:38:540237デフォルトの名無しさん
2006/11/13(月) 11:34:01はどういう意味ですか?
0238デフォルトの名無しさん
2006/11/13(月) 11:37:07配列変数 @value の最後の添え字
@value = ('a', 'b', 'c', 'd')
なら最後の要素 'd' は $value[4] なので $#value は 4 になる
0239デフォルトの名無しさん
2006/11/13(月) 11:37:530240237
2006/11/13(月) 11:39:46>$#変数名 は、@変数名 の配列の最後の添え字(個数から1をひいたもの)を表わします。
0241デフォルトの名無しさん
2006/11/13(月) 11:40:33レスありがとうございました。
添え字をあらわすんですね。
0242デフォルトの名無しさん
2006/11/13(月) 11:47:180243デフォルトの名無しさん
2006/11/13(月) 11:55:17$#value はあくまでも最後の添え字として扱うべきで、
$#value + 1 を要素数として使うべきではないって偉い人が本に書いてた。
0244デフォルトの名無しさん
2006/11/13(月) 11:55:230245デフォルトの名無しさん
2006/11/13(月) 11:56:250246デフォルトの名無しさん
2006/11/13(月) 11:57:43>>235のゆうように比較対象を配列にいれて、
勝ち抜き合戦を一回ループすればおk
最小値を求めるのも同じ。
ソートはまた別の話だから混乱しないように。
パールっつよりプログラミングの基本テクニック
だから、どこにでも参考資料はあると思うよ
0247デフォルトの名無しさん
2006/11/13(月) 12:10:14ブロック引数を与えたらブロックの値を最大or最小にする要素を
返してくれれば便利なのになといつも思う。
min { $x[$_] } 0..$#x
みたいに使うイメージで。
0248デフォルトの名無しさん
2006/11/13(月) 12:11:370249デフォルトの名無しさん
2006/11/13(月) 12:42:07それぐらいならこれでいいじゃん
0250デフォルトの名無しさん
2006/11/13(月) 12:50:45添え字が欲しいんじゃなかったっけ? それだと値のほうになってしまうよ。
reduce { $x[$a] < $x[$b]? $a: $b } 0..$#x
でもいいんだけど$aだの$bだの何度も書くの面倒だし。
0251デフォルトの名無しさん
2006/11/13(月) 12:57:490252デフォルトの名無しさん
2006/11/13(月) 13:34:480253デフォルトの名無しさん
2006/11/13(月) 14:30:21処理可能な数値の最大最小を表す定数なり
特殊変数はないん?
0254デフォルトの名無しさん
2006/11/13(月) 14:40:38use POSIX
0255デフォルトの名無しさん
2006/11/13(月) 15:47:36|
|
|
∧|∧
( / ⌒ヽ | ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |
∪ / ノ . |
ノ ノ ノ */
main (
)
{
}
0257デフォルトの名無しさん
2006/11/13(月) 20:12:160258デフォルトの名無しさん
2006/11/13(月) 21:50:470259デフォルトの名無しさん
2006/11/13(月) 22:19:480260デフォルトの名無しさん
2006/11/13(月) 22:51:09普通にできる
0261デフォルトの名無しさん
2006/11/13(月) 22:51:330262デフォルトの名無しさん
2006/11/14(火) 02:23:45ありがとうございます。
hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると
Argument "ホゲホゲ 5" is not numeric in array element at ./a.pl, <> line 28
の用にエラーが出ます。
何がいけないのでしょうか?
0263デフォルトの名無しさん
2006/11/14(火) 02:39:27> 独習終えたら何を読むといいですかね?
主要モジュールや最近バリバリ書かれているとんがったシステムのソースコード。
0264デフォルトの名無しさん
2006/11/14(火) 02:42:13> hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると
ホントか? ホントにそう書いてあるか?
0265デフォルトの名無しさん
2006/11/14(火) 02:54:07hashに 「ホゲホゲ 5」 をいれて
keyに 「10」 を入れた時に以下のエラーが出ます。
日本語の取り扱いが間違ってるのでしょうか?
Argument "M-^CzM-^CQM-^CzM-^CQ 5" isn't numeric in array element at ./a.pl line 32, <> line 1.
0266デフォルトの名無しさん
2006/11/14(火) 03:07:060267265
2006/11/14(火) 03:16:46#!/usr/bin/perl -w
# hash----------------------------
%cn2p;
while(<>){
chomp;
# print "$_\n";
@words = split;
# print "n1 $words[0]\n";
# print "n2 $words[1]\n";
# print "n3 $words[2]\n";
$tmp = $words[1] . " " . $words[2];
$cn2p[$tmp] += $p;
}
0268265
2006/11/14(火) 03:18:44間違い。
簡略化したのでエラーが出るのは最後の行です。
10 ホゲホゲ 5
と言うのをファイルから読ませています。
#!/usr/bin/perl -w
# hash----------------------------
%cn2p;
while(<>){
chomp;
# print "$_\n";
@words = split;
# print "n1 $words[0]\n";
# print "n2 $words[1]\n";
# print "n3 $words[2]\n";
$tmp = $words[1] . " " . $words[2];
$cn2p[$tmp] += $words[0];
}
0269デフォルトの名無しさん
2006/11/14(火) 03:21:21Argument "M-^CzM-^CQM-^CzM-^CQ 5" isn't numeric in array element at ./a.pl line 32, <> line 1.
って、配列の添字に数値じゃないのが入れられてるっていうエラーなんだが。
0270デフォルトの名無しさん
2006/11/14(火) 03:21:56答えを言うのはもったいないので、とりあえず use strict してみようよ。
0271265
2006/11/14(火) 03:28:11hashには数値以外も入れられるんじゃないのでしたっけ?
0272デフォルトの名無しさん
2006/11/14(火) 03:29:44あなたのコードには、hashは存在しません。
0273265
2006/11/14(火) 03:32:54わかりました!
ありがとうございます。
0274デフォルトの名無しさん
2006/11/14(火) 03:46:09答え言っちゃダメでしょw
■ このスレッドは過去ログ倉庫に格納されています