トップページ⇒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
01531502006/11/09(木) 20:12:50
>>152
いいんでね?流れ的にも pos の出番じゃなさそーだしw


っと規制解除の prin 経由でカキコテスト
0154デフォルトの名無しさん2006/11/09(木) 20:14:22
かけたのはいいけどまちごーた orz...
153 は 149 です。150 さん御免。
0155デフォルトの名無しさん2006/11/09(木) 20:15:04
>>152
無視が許容されているから答える人がたくさん現われるのである。
0156145=1502006/11/09(木) 20:47:33
>149,153

ごめん。
pos何て使ったことないから勉強のため、それも試したんだけど、

my $str = 'hogefugehagehoge';
print +( pos $str ) . "\n" while $str =~ /(hage)/g;
print $-[1];
--------------------------------
12
8

こんな答えがでたんで、どうレスつけていいか迷って。。。。
塚、プログラムの方が忙しくて、忘れてしまったです スマソ
0157デフォルトの名無しさん2006/11/09(木) 21:05:54
pos SCALAR
SCALAR に対して前回に m/ /g サーチが行われた場所を返す。この関数は、最後に
マッチした場所の次の文字のオフセットを返す・・。

programing Perl / 2nd Edition 改訂版 P.228 より。
0158デフォルトの名無しさん2006/11/09(木) 22:59:34
>>143
open $fh, $filename が使えないんなら、use FileHandleとかすればいいんじゃね?

0159デフォルトの名無しさん2006/11/10(金) 17:00:16
はじめまして
v5.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
>>159
質問するならOSなどの環境とどう動かないか(エラーが出るとか、一見動いたように見えるが
結果がこうなるはずなのにこうなったとか)を説明しろよ。
01611592006/11/10(金) 17:28:08
>>160
すいません。

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:41
>>161
my $cmd = 'cmd perl hoge.pl < in.txt';
でどうかな?(試していないが)
01631592006/11/10(金) 18:28:36
>>162
うまくいきませんでした。

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
>>163
幾つか試してみたけれど、その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
>>164
色々試してくれてありがと。

hoge.plでは

print "好きな数字は?:";
$s=<STDIN>;
print "好きな数字は$s\n";

のみにしてみた。

in.txtは「1」だけ入れたけど、失敗

ちょっと。ActivePerl build 819に変えてやってみます。817だったので
0166デフォルトの名無しさん2006/11/10(金) 20:32:06
>>165
バージョンアップして駄目だったら、環境疑ったほうがよさそうだね。

んでかなり特殊な状況だけれど、その現象が起きる状態見っけた。
PERL5SHELL環境変数に値がセットされてないか調べてみれ。
それとPATHが通ってる場所に変なcmd.exeが無いかどうかも。
ttp://perldoc.jp/docs/perl/5.6.1/perlrun.pod#item_PERL5SHELL__specific_to_the_Win32_port_
01671592006/11/10(金) 20:46:44
バージョンアップしてもダメでした…。

>PERL5SHELL環境変数に値がセットされてないか調べてみれ
>それとPATHが通ってる場所に変なcmd.exeが無いかどうかも

Path=C:\Program Files\MeCab\bin;C:\Perl\bin;C:\cygwin\bin;
PERL5SHELLはどうやってみる&変更するんでしょうか?
教えてもらえないでしょうかお願いします。
0168164=1662006/11/10(金) 21:48:16
>>167
# 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
になっているかで確認できる。

これらが白ならいよいよ漏れには解らん。
01691592006/11/10(金) 22:00:28
164=166=168さん
色々とありがとうございます

>マテ、さっきプロンプトに$を使ってたがCygwin上のシェルからActivePerlを呼んでるのか。

いえ、Windowsのコマンドプロンプトで使っています。
cygwinのパスを通してるだけです

>見るには(コマンドプロンプトでもbashでも)setコマンド。
>結果にPERL5SHELLが含まれてないか確認。
見てみますと、なかったので追加したんですが、うまく実行できませんでした

ながながとありがとうございます、今度友達のパソを借りて(違う環境で)試してみたいと思います
0170デフォルトの名無しさん2006/11/10(金) 22:09:23
cmd 経由でコマンドを実行するには、cmd /c 〜
後はCygwinのPerlが動いてたりとか。
0171デフォルトの名無しさん2006/11/11(土) 10:53:49
Windows2000 + ActivePerlでテキスト処理などをやっているのですが、
今度から業務移管で別の担当者が行うことになりました。

で、引き継ぎをしたら「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
Perl初心者なんですが、
変数に代入された値が数値か文字列かを
判別するにはどうすればいいんでしょうか?
0174デフォルトの名無しさん2006/11/11(土) 13:14:46
多分 /\D/辺りを期待してるんだと思うけど
内部的には数値文字の区別ないよ

$string = '123xx';
$num = $string + 0;
print $string. " $num";
----------------
123xx 123
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でいいのでここは笑うところだったのかもしれず
■ このスレッドは過去ログ倉庫に格納されています