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
0154デフォルトの名無しさん
2006/11/09(木) 20:14:22153 は 149 です。150 さん御免。
0155デフォルトの名無しさん
2006/11/09(木) 20:15:04無視が許容されているから答える人がたくさん現われるのである。
0156145=150
2006/11/09(木) 20:47:33ごめん。
pos何て使ったことないから勉強のため、それも試したんだけど、
my $str = 'hogefugehagehoge';
print +( pos $str ) . "\n" while $str =~ /(hage)/g;
print $-[1];
--------------------------------
12
8
こんな答えがでたんで、どうレスつけていいか迷って。。。。
塚、プログラムの方が忙しくて、忘れてしまったです スマソ
0157デフォルトの名無しさん
2006/11/09(木) 21:05:54SCALAR に対して前回に m/ /g サーチが行われた場所を返す。この関数は、最後に
マッチした場所の次の文字のオフセットを返す・・。
programing Perl / 2nd Edition 改訂版 P.228 より。
0158デフォルトの名無しさん
2006/11/09(木) 22:59:34open $fh, $filename が使えないんなら、use FileHandleとかすればいいんじゃね?
0159デフォルトの名無しさん
2006/11/10(金) 17:00:16v5.8.8 builtを使用しています
system関数を使用して2〜3個のプログラムを連続で実行させようとしているのですが
「system("Perl hoge.pl < in.txt")」 が実行できません。
誰かご教授お願いします。
「system("Perl hoge.pl in.txt")」のほうはうまくいきました
試した例
my @cmd = ('perl', 'hoge.pl', '< in.txt');
my $ret = system @cmd;
my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;
0160デフォルトの名無しさん
2006/11/10(金) 17:20:15質問するならOSなどの環境とどう動かないか(エラーが出るとか、一見動いたように見えるが
結果がこうなるはずなのにこうなったとか)を説明しろよ。
0161159
2006/11/10(金) 17:28:08すいません。
OS: XP
my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;
print $ret;
を入れたところ、「65280」という値が返ってきて、失敗しました。
my @cmd = ('perl', 'hoge.pl', '< in.txt');
my $ret = system @cmd;
print $ret;
の場合はhoge.plは実行されますが、< in.txtが引数(@argv)と勘違いされてるのか標準入力がうまくいきませんでした。(入力画面で止まる)
0162デフォルトの名無しさん
2006/11/10(金) 17:36:41my $cmd = 'cmd perl hoge.pl < in.txt';
でどうかな?(試していないが)
0163159
2006/11/10(金) 18:28:36うまくいきませんでした。
my $cmd = 'cmd perl hoge.pl < in.txt';
my $ret = system ($cmd);
if ($ret != 0) {
print "error [$ret]\n";
}
で、試した所
error [65280]
となりました。
ちなみに
$ perl hoge.pl < in.txt とそのまま実行はできていますので、in.txtがない、名前を間違えてる等の間違いはないです。
0164デフォルトの名無しさん
2006/11/10(金) 19:04:14幾つか試してみたけれど、そのExit codeはhoge.plの中にエラーがある場合に帰ってきてるな。
hoge.plをもっと単純な内容に変えてやってみたらどうなる?
うちの環境(ActivePerl build 819 on Windows XP)では、
hoge.plを空のスクリプトや、標準入力の内容をそのまま表示するだけの内容にして
my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;
でちゃんと動いてる
0165デフォルトの名無しさん
2006/11/10(金) 19:50:22色々試してくれてありがと。
hoge.plでは
print "好きな数字は?:";
$s=<STDIN>;
print "好きな数字は$s\n";
のみにしてみた。
in.txtは「1」だけ入れたけど、失敗
ちょっと。ActivePerl build 819に変えてやってみます。817だったので
0166デフォルトの名無しさん
2006/11/10(金) 20:32:06バージョンアップして駄目だったら、環境疑ったほうがよさそうだね。
んでかなり特殊な状況だけれど、その現象が起きる状態見っけた。
PERL5SHELL環境変数に値がセットされてないか調べてみれ。
それとPATHが通ってる場所に変なcmd.exeが無いかどうかも。
ttp://perldoc.jp/docs/perl/5.6.1/perlrun.pod#item_PERL5SHELL__specific_to_the_Win32_port_
0167159
2006/11/10(金) 20:46:44>PERL5SHELL環境変数に値がセットされてないか調べてみれ
>それとPATHが通ってる場所に変なcmd.exeが無いかどうかも
Path=C:\Program Files\MeCab\bin;C:\Perl\bin;C:\cygwin\bin;
PERL5SHELLはどうやってみる&変更するんでしょうか?
教えてもらえないでしょうかお願いします。
0168164=166
2006/11/10(金) 21:48:16# Perlの質問ではなくなってきてるけれど(;´Д`A
> Path=(snip);C:\cygwin\bin;
マテ、さっきプロンプトに$を使ってたがCygwin上のシェルからActivePerlを呼んでるのか。
> PERL5SHELLはどうやってみる&変更するんでしょうか?
見るには(コマンドプロンプトでもbashでも)setコマンド。
結果にPERL5SHELLが含まれてないか確認。
変更方法までは面倒見切れんので グ グ れ。
> PATHが通ってる場所に変なcmd.exeが無いかどうか
はCygwin上から使っててwhichを入れてあるなら
$ which cmd.exe
/cygdrive/c/WINDOWS/system32/cmd.exe
になっているかで確認できる。
これらが白ならいよいよ漏れには解らん。
0169159
2006/11/10(金) 22:00:28色々とありがとうございます
>マテ、さっきプロンプトに$を使ってたがCygwin上のシェルからActivePerlを呼んでるのか。
いえ、Windowsのコマンドプロンプトで使っています。
cygwinのパスを通してるだけです
>見るには(コマンドプロンプトでもbashでも)setコマンド。
>結果にPERL5SHELLが含まれてないか確認。
見てみますと、なかったので追加したんですが、うまく実行できませんでした
ながながとありがとうございます、今度友達のパソを借りて(違う環境で)試してみたいと思います
0170デフォルトの名無しさん
2006/11/10(金) 22:09:23後はCygwinのPerlが動いてたりとか。
0171デフォルトの名無しさん
2006/11/11(土) 10:53:49今度から業務移管で別の担当者が行うことになりました。
で、引き継ぎをしたら「CUIだと非常に使いにくい」とか
「GUIのコマンドラッパーみたいなもの作れないの?」と言われてます。
何か簡単に実現できるよい手はないでしょうか?
自分はckw+Nyacusで満足してたのですが・・。
0172デフォルトの名無しさん
2006/11/11(土) 10:54:15$ftp = Net::FTP->new
の$ftpをサブルーチンに渡すにはどうすればいいでしょうか?
&net($ftp);
sub net {
my $ftp = shift;
$ftp->ls;
}
のようにしたのですができないようです。
0173デフォルトの名無しさん
2006/11/11(土) 12:56:16変数に代入された値が数値か文字列かを
判別するにはどうすればいいんでしょうか?
0174デフォルトの名無しさん
2006/11/11(土) 13:14:46内部的には数値文字の区別ないよ
$string = '123xx';
$num = $string + 0;
print $string. " $num";
----------------
123xx 123
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:48■ このスレッドは過去ログ倉庫に格納されています