トップページ⇒tech
1001コメント344KB

Perlについての質問箱 28箱目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/10/31(火) 14:52:21
"The duct tape of the Internet" こと、Perlについての質問箱です。
"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
>>172
普通にできると思うけど。
そもそもサブルーチンなしなら出来ているという確認はしたの?
サブルーチンなしでも出来ない、別の問題というオチじゃ
0176岐山面2006/11/11(土) 13:33:19
>>173
残念だが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
>>173
>>174の言うとおり、内部では区別なし。
次の質問は「数値として適切な文字列を判定する方法は?」
と「値を数値と解釈したい(or そのまま文字列として解釈したい)」
が予想されるが。。。

前者の簡単な判断は $val =~ /¥D/ なら数値以外が含まれていることになる。
が、小数点や符号や浮動小数点を考慮するともう少し複雑になる。

後者は、「$val + 0」で数値として扱われる。
算術演算子で扱わなければ文字列として扱われるが、「$val . ""」で文字列として扱われる。
0178デフォルトの名無しさん2006/11/11(土) 13:55:33
はらたいらに全部。本名だったんだ。
ttp://www.nikkei.co.jp/news/past/honbun.cfm?i=AT1G10035%2010112006&g=K1&d=20061110
0179デフォルトの名無しさん2006/11/11(土) 14:15:44
Math::BigRatとかつこたらええやん
0180デフォルトの名無しさん2006/11/11(土) 14:17:48
Scalar::Utilのlooks_like_number使っとけ。perlの判定API呼ぶからいちばん確実
0181デフォルトの名無しさん2006/11/11(土) 14:27:04
>>174
>>176
>>177
レスありがとうございます。$val + 0で期待通りの動作に出来ました。
0182デフォルトの名無しさん2006/11/11(土) 16:46:58
ここはモジュールのインストールについての質問をしてもOKですか?
0183岐山面2006/11/11(土) 17:01:14
モジュールのインストールなら、ActiveStateのPPMを利用すれば簡単だろう
01841822006/11/11(土) 17:16:49
Solaris10 x86を使っていて、できれば後学のためActiveperlじゃないのでやりたいと考えていました。
DBD::mysqlについてです。
0185岐山面2006/11/11(土) 17:27:39
非PPMのインストール経験がないから分かりません-_-
0186デフォルトの名無しさん2006/11/11(土) 17:47:07
>>184
基本は
$ perl Makefile.PL
$ make
$ make test
$ make install (ここは root 権限で)
なので、一度やってみ。
01871822006/11/11(土) 18:19:05
>>186
ありがとうございます。
書いて下さった手順は一通りやっていて、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
>>187
オラわかんね。
ちなみに、Solarisに二つperlが入ってるってことはないよね?
/usr/bin/perl と /usr/local/bin/perl があって、DBD のインストール対象と mt.cgi が
使ってるものが違うとか。ハズしてたらめんご。
0189デフォルトの名無しさん2006/11/11(土) 19:15:10
>>187
こんなの見つけたよう。
http://dev.mysql.com/doc/refman/4.1/ja/perl-support-problems.html
01901822006/11/11(土) 19:48:11
レスありがとうございます。

>>188
難しいですよね(´・ω・`)
デフォルトで入っていたものは退避させていて、新しい方を見に行くように設定しています。

>>189
わざわざありがとうございます。
しかし、書いてあるような"-static -config"ってオプションはないみたいなんですよ。
バージョン5系を使っているので、無くなっちゃったんですかね。。。
01911822006/11/11(土) 19:56:39
libmysqlclient.soは既に/usr/libに入ってて、
LD_LIBRARY_PATHにもLDFLAGSにも/usr/libを通しているんですけどね。。。
困りました(^_^;)
0192デフォルトの名無しさん2006/11/11(土) 21:23:54
>>191
http://perldoc.jp/docs/modules/DBD-mysql-2.1026/DBD/mysql/INSTALL.pod

内の「既知の問題」の 3. がそれっぽい気がします。
mysqlclient.so では動作せず、スタティックリンクが必要なシステムがあるということのようです。
僕もようわからんので、追加情報 & 経過報告よろしく。
0193デフォルトの名無しさん2006/11/11(土) 22:07:08
>>191
問題の切り分けとして。
シンプルなテストプログラムですら動かない?
use DBI;
$dbh = DBI->connect('DBI:mysql:dbxxx:hostxxx', 'userxxx', 'passxxx');
くらいでもいいと思うけど。
01941822006/11/11(土) 22:08:44
>>192
ありがとうございます。
libmysqlclient.so周りがあやしい、っていうのは前出のと同じ感じなんですね。
オプションの指定の仕方がハッキリとは書いてない感じなので、いろいろ試してみます。

・libmysqlclient.aを/usr/libにコピー→変わりなし
# 明示的に指定しないとダメなんですね(^_^;)

・mysql_config --libsの結果をコピーして、mysqlclient部分をlibmysqlclient.a
のフルパスに書き換え、貼り付け→オプションエラー
0195デフォルトの名無しさん2006/11/11(土) 22:34:17
>>171
Perl/Tk使うとか?
あるいはWin32::GUI::Loftとか。
01961822006/11/11(土) 23:35:48
>>193
一行目に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
>>196
>一行目にperlパス追加した

もしかして perl に -w オプション付けてる? だったら -w 外すか、
my $dbh = ..
にしてみて。動いてるような気がする、のはらたいらに3000点
01981822006/11/12(日) 00:35:36
>>197
…付けてました!
外したらエラーは出なくなりました。
0199デフォルトの名無しさん2006/11/12(日) 00:52:17
>>198
ということは、最低限DBに接続できていると言うことになるんじゃ?
試しにパスワードとかデタラメにしてエラーが出るように変わるか確認すればいいよね。
ということは、DBDのインストール成功(make testの影響はわからないが)。

じゃ、mt.cgi は何でよ、ってのはわからんけど。
02001822006/11/12(日) 01:14:38
>>199
ユーザ、パスワードイジったらコネクションできなかったので何らかの形にはなってる、ってことですね。
MTのモジュールチェック用CGIでもインストールされている、という表示は出ています。

ますます原因がわからなくなってきましたね(´・ω・`)
0201デフォルトの名無しさん2006/11/12(日) 01:15:55
素朴な疑問だけど、chompは何て読むの?
0202デフォルトの名無しさん2006/11/12(日) 01:20:11
ちょーマジックポイント
0203デフォルトの名無しさん2006/11/12(日) 01:39:38
perlってうにxのシェルのsh -xみたいなデバッグコマンドある?
0204デフォルトの名無しさん2006/11/12(日) 02:23:33
>>203
Devel::Trace
0205デフォルトの名無しさん2006/11/12(日) 07:43:34
Perlってなんでこんなに楽しいの?
0206デフォルトの名無しさん2006/11/12(日) 08:29:10
if (($str eq 'ほげ') || ($str eq 'ふが') || ($str eq 'もが')) {
print "hoge\n";
}

これを簡略化して

if ($str eq ('ほげ' || 'ふが' || 'もが')) {
print "hoge\n";
}

としたのですが、うまくいきませんでした。
簡単に書ける方法があったら教えてください。
0207デフォルトの名無しさん2006/11/12(日) 08:45:03
if ($str =~ /^(ほげ|ふが|もが)$/) print "hoge\n";

ただし ほげ ふが もが にマルチバイト文字や記号が入る時は
\Q と \E で囲わないと、ダメな場合がある。 >>82-84 辺りを参照。
0208デフォルトの名無しさん2006/11/12(日) 08:51:31
これはどうか
print "hoge\n" if grep {$str eq $_} ('ほげ', 'ふが', 'もが')
02092062006/11/12(日) 10:10:14
>>207
なるほどお
正規表現を使うことは全く頭にありませんでした。
ひとつ知恵が付きました。

>>208
grep関数、知らなかったので調べてみました。
これ便利ですね。 

>>207-208
おかげで解決しました。
レスありがとうございました。
0210デフォルトの名無しさん2006/11/12(日) 11:17:00
サブルーチンで渡しちゃうという手もあるかな。
まあ、そこまでするくらいなら普通に比較した方が楽だとは思うけど
比較文字列に何らかの修正を加える場合なら一考の余地ありかと思う。

大文字小文字を区別しないとか、半角カナ・全角カタカナ・ひらがなを区別しないとか。
0211デフォルトの名無しさん2006/11/12(日) 11:37:24
>>206
解決隅にレスるのもなんだが誰も指摘しないので一応書いとく。
my $str = 'bar' ;
if ( $str eq 'fuga' || 'hoge' || 'bar' ){ print 'hoge' . "\n" ; }
0212デフォルトの名無しさん2006/11/12(日) 11:39:12
211 は忘れてくれ。
0213デフォルトの名無しさん2006/11/12(日) 13:03:46
>>205
君がperlを愛しているからさ
0214デフォルトの名無しさん2006/11/12(日) 13:34:15
http://search.cpan.org/~cfranks/Perl6-Junction-1.10/Junction.pm

一応こういうものもある。
Perl6では言語機能として提供されるようだね。
0215デフォルトの名無しさん2006/11/12(日) 18:21:48
ファイルのバイナリダンプから先頭32バイトを削除したいのですが、
手動でバイナリエディタから削除したものと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 したところ
同一のファイルが出力されることは確認してます
02161822006/11/12(日) 18:26:45
再起動して気付いたのですが、mt.cgiを、コマンドライン上では、
環境変数LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/(mysqlのインストール先ディレクトリの、ライブラリがある場所)がないと
>>193さんのテストスクリプトも動かなくなります。
逆に、追加してあるとコマンドライン上でmt.cgiもエラーを吐かなくなります。
ブラウザ上では相変わらずなので、見に行くライブラリの指定が足りない状態でインストールされてる、ってことなんでしょうかね。。。


0217デフォルトの名無しさん2006/11/12(日) 18:26:54
と、追記。この場合は単純に削除ですが
置換等の作業もするので16進ダンプを使用したいのです
最初の確認で躓き…orz
02181822006/11/12(日) 18:36:26
すいません、>>216文章変でした。一行目の「mt.cgiを、」は余計です。。。
コマンドライン上だと下のような実行結果になる、ということです。

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
>>218
なるほど、LD_LIBRARY_PATH の問題だったか。
じゃあ、httpd にも LD_LIBRARY_PATH を設定すれば解決するんじゃないかな。
Solarisではどのように httpd 起動してるんだっけな。
/etc/init.d/httpd あたりだっけ? そこで追記するか、そこから apachectl を
呼び出しているなら apachectl へ追記するか。で、httpd を再起動。
スレ違いになっちゃったけどね。
02202152006/11/12(日) 20:20:29
うわー、ごめんなさい、元ファイルの抽出方法が違ったんで微妙に異なってたようです
同一の方法で抽出からやり直したところ、ちゃんと想定通りの結果になりました。
スレ汚し申し訳ない…
02211822006/11/12(日) 22:33:06
>>219
ありがとうございます、ようやく解決できました。
やはり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:44
>>222
use File::Slurp;

my $text = read_file('filename');

0224デフォルトの名無しさん2006/11/13(月) 00:05:10
>>223
ありがとうございます。それ調べてみます。
ちなみに、モジュールを使わないケースではどうなりますか?
0225デフォルトの名無しさん2006/11/13(月) 00:12:09
>>215みたいのでもいいんじゃない?
0226デフォルトの名無しさん2006/11/13(月) 00:12:12
[1]
{
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 ; <> } ;
02272222006/11/13(月) 00:28:11
ありがとうございます。
と、取り敢えず安全性?なんたるものか調べます。
0228さくら2006/11/13(月) 00:51:29
リナックスでperlのプログラムを実行しています。
「画面上に(kterm)に「last
            proxy  」と二つのメニュー(それぞれプログラム
名)を表示させ、lastをクリックして選べばlastコマンドの出力から、
自分(0123456)がログインした回数を数える(他のユーザーは数えない)
サブルーチンが実行される。
 またproxyを選べば、proxyのログから、ある今までにもっともサイト
にアクセスした時間帯を表示するサブルーチンが実行される。」
というプログラムを組みたいのです。proxyはどんな解析がいいか、
いろいろ考え中でしたが一例として述べました。。。どなたか、アドバイス等
お願いします!!!!
0229デフォルトの名無しさん2006/11/13(月) 01:14:14
>>228
日本語でおq
0230デフォルトの名無しさん2006/11/13(月) 01:29:33
Perlは肌に合わないとわかった
これは完全に文系向けのものだな
厳密でない
基本的に1次元のデータが基本
列操作、多次元操作がまともにできないってどんなくそ言語だよ・・・
fortran90から移行したが
それととくらべると
とんでもないだめ言語だな
perlは
0231デフォルトの名無しさん2006/11/13(月) 01:32:20
>>230
その通りだな!! 時間の無駄だから、さっさとPerlのことは忘れた方がいい。
がんばってくれ。

0232デフォルトの名無しさん2006/11/13(月) 01:36:55
>>228
アドバイスとしては、ちゃんと読み書きの勉強して、色々な本を読もうね、ってとこかな。
0233デフォルトの名無しさん2006/11/13(月) 04:40:51
3つの変数のうちのどれが一番小さいかを調べたいです。
下記が今使っているコードですが、これをもっとスマートに書く方法があれば教えてください。

$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";
}
02342332006/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:54
バブルソート最強伝説
0237デフォルトの名無しさん2006/11/13(月) 11:34:01
$#value
はどういう意味ですか?
0238デフォルトの名無しさん2006/11/13(月) 11:37:07
>>237
配列変数 @value の最後の添え字
@value = ('a', 'b', 'c', 'd')
なら最後の要素 'd' は $value[4] なので $#value は 4 になる
0239デフォルトの名無しさん2006/11/13(月) 11:37:53
アチャー>< 3 の間違いです… これは恥ずかしいw
02402372006/11/13(月) 11:39:46
事故解決しました。
>$#変数名 は、@変数名 の配列の最後の添え字(個数から1をひいたもの)を表わします。
0241デフォルトの名無しさん2006/11/13(月) 11:40:33
>>238-239
レスありがとうございました。
添え字をあらわすんですね。
0242デフォルトの名無しさん2006/11/13(月) 11:47:18
$#valueは要素数を返す方が直感的
0243デフォルトの名無しさん2006/11/13(月) 11:55:17
スカラコンテキストなら @value って書けば要素数になるんだからよくね?

$#value はあくまでも最後の添え字として扱うべきで、
$#value + 1 を要素数として使うべきではないって偉い人が本に書いてた。
0244デフォルトの名無しさん2006/11/13(月) 11:55:23
……
0245デフォルトの名無しさん2006/11/13(月) 11:56:25
ま、添字の初期値を変更する変質者もいるかもしれんし。
0246デフォルトの名無しさん2006/11/13(月) 11:57:43
>>234
>>235のゆうように比較対象を配列にいれて、
勝ち抜き合戦を一回ループすればおk
最小値を求めるのも同じ。
ソートはまた別の話だから混乱しないように。
パールっつよりプログラミングの基本テクニック
だから、どこにでも参考資料はあると思うよ
0247デフォルトの名無しさん2006/11/13(月) 12:10:14
Scalar::Utilのmax,minが単に最大値、最小値求めるだけじゃなくて
ブロック引数を与えたらブロックの値を最大or最小にする要素を
返してくれれば便利なのになといつも思う。

min { $x[$_] } 0..$#x

みたいに使うイメージで。
0248デフォルトの名無しさん2006/11/13(月) 12:11:37
ごめん、ぼけてた。ScalarじゃなくてList::Util
0249デフォルトの名無しさん2006/11/13(月) 12:42:07
min @x[0..$#x];
それぐらいならこれでいいじゃん
0250デフォルトの名無しさん2006/11/13(月) 12:50:45
>>249
添え字が欲しいんじゃなかったっけ? それだと値のほうになってしまうよ。

reduce { $x[$a] < $x[$b]? $a: $b } 0..$#x

でもいいんだけど$aだの$bだの何度も書くの面倒だし。
0251デフォルトの名無しさん2006/11/13(月) 12:57:49
あーなるほど。
0252デフォルトの名無しさん2006/11/13(月) 13:34:48
@x[0..$#x]は配列スライスを使うまでもなく@xでいいのでここは笑うところだったのかもしれず
0253デフォルトの名無しさん2006/11/13(月) 14:30:21
perlにはINT_MAXとかDBL_MAXみたいな
処理可能な数値の最大最小を表す定数なり
特殊変数はないん?
0254デフォルトの名無しさん2006/11/13(月) 14:40:38
>>253
use POSIX
0255デフォルトの名無しさん2006/11/13(月) 15:47:36
   /*
   |
   |
   |
  ∧|∧
 ( / ⌒ヽ     | ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | |   |     |
  ∪ / ノ  .   |
  ノ ノ ノ      */
 main       (
           )
           {
           }
02562532006/11/13(月) 16:12:04
>>254 アリガント
0257デフォルトの名無しさん2006/11/13(月) 20:12:16
みんなきちんとパールの話題したいんですか?って疑問におもう。。。
0258デフォルトの名無しさん2006/11/13(月) 21:50:47
Linux上で日本語のファイルをperlで処理したいですが普通にできますか?
0259デフォルトの名無しさん2006/11/13(月) 22:19:48
独習終えたら何を読むといいですかね?
0260デフォルトの名無しさん2006/11/13(月) 22:51:09
>>258
普通にできる
0261デフォルトの名無しさん2006/11/13(月) 22:51:33
でらべっぴん はオススメ
0262デフォルトの名無しさん2006/11/14(火) 02:23:45
>>260
ありがとうございます。
hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると

Argument "ホゲホゲ 5" is not numeric in array element at ./a.pl, <> line 28

の用にエラーが出ます。
何がいけないのでしょうか?
0263デフォルトの名無しさん2006/11/14(火) 02:39:27
>>259
> 独習終えたら何を読むといいですかね?

主要モジュールや最近バリバリ書かれているとんがったシステムのソースコード。
0264デフォルトの名無しさん2006/11/14(火) 02:42:13
>>262
> hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると

ホントか? ホントにそう書いてあるか?
0265デフォルトの名無しさん2006/11/14(火) 02:54:07
>>264
hashに 「ホゲホゲ 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:06
とりあえずエラーが出た行あたりのプログラムさらしてもらったほうがいいと思うけどな。
02672652006/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;
}
02682652006/11/14(火) 03:18:44
>>267
間違い。
簡略化したのでエラーが出るのは最後の行です。

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:21
だからさ、

Argument "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
>>268
答えを言うのはもったいないので、とりあえず use strict してみようよ。
02712652006/11/14(火) 03:28:11
>>269
hashには数値以外も入れられるんじゃないのでしたっけ?
0272デフォルトの名無しさん2006/11/14(火) 03:29:44
>>271
あなたのコードには、hashは存在しません。
02732652006/11/14(火) 03:32:54
>>272
わかりました!

ありがとうございます。
0274デフォルトの名無しさん2006/11/14(火) 03:46:09
なにこの面白い流れw
答え言っちゃダメでしょw
■ このスレッドは過去ログ倉庫に格納されています