トップページ⇒tech
994コメント314KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん05/01/17 18:11:32
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc5.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。

http://www.perl.org/get.html
● 2005/01/17現在の最新版: 5.8.6
● 2005/01/17現在の開発版: 5.9.1
0002デフォルトの名無しさん05/01/17 18:20:41
● 過去ログ

1 http://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 http://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 http://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 http://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 http://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 http://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 http://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 http://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 http://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 http://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 http://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 http://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 http://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 http://pc5.2ch.net/test/read.cgi/tech/1101649274/
0003デフォルトの名無しさん05/01/17 18:22:45
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873110378/

[オンラインマニュアル]
Perldoc.com: http://www.perldoc.com/
perldoc.jp: http://www.perldoc.jp/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
Perlの小技: http://homepage3.nifty.com/hippo2000/perltips/index.htm
0004105/01/17 18:26:48
過去ログは7、8箱目だけ閲覧不可でした。
9〜14が開けない場合、2chブラウザ以外で試してください。
0005105/01/17 18:28:51
前スレにアドレス貼るの間に合わなかった。スマン。
0006デフォルトの名無しさん05/01/17 20:00:00,
>>1 乙
ageとこう
0007デフォルトの名無しさん05/01/17 21:17:40
perl-5.8になってsetuidが使えなくなった?
0008デフォルトの名無しさん05/01/17 21:32:24
>>7
普通に動いてるよ

ところで>>6の時刻の後にカンマが見えるのは自分だけか・・・
0009デフォルトの名無しさん05/01/17 21:56:37
俺も見えるな、0が続くと付くのか?

0010デフォルトの名無しさん05/01/17 21:58:55
perlのプログラ厶上でUNIXコマンドを使用する方法が分からないです。

googleで探してもUNIXコマンドのページばかりひっかかってどうしても見付かりません

どなたか御指導お願いします。
0011デフォルトの名無しさん05/01/17 22:08:59
system
00121005/01/17 22:10:15
すいません、あれからまた調べ続けたら…やっと見つかりました

'ls ./' などのようにすればいいだけなのですね。
お騒がせしました。
0013デフォルトの名無しさん05/01/17 22:15:26
>>12
それシングルクォーテーションじゃ・・・
とりあえず三通り

[1]
system("command");

[2]
open(PIPE, "command |");
@msg = <PIPE>;
close PIPE;

[3]
$msg = `command`;

3番はバッククォーテーションだから注意
0014デフォルトの名無しさん05/01/17 22:53:37
形態の印ね。, → Oに改変。
0015デフォルトの名無しさん05/01/17 23:46:44
え、、、exec("command");、、、ハアハア
0016デフォルトの名無しさん05/01/17 23:49:48
ドコモ携帯テス�d
0017デフォルトの名無しさん05/01/17 23:52:39
ə
0018デフォルトの名無しさん05/01/18 22:12:17
15箱目ですか乙です。
14 の次が 15 だと推論するのに時間がかかりました。
なんか閑散としてますが他の人も同じなのか?
0019デフォルトの名無しさん05/01/18 22:15:30
これがデフォ。
よほどのネタ振りがあるか
粘着初心者くんでもいないかぎり。

まあ大抵後者でスレが消化されて行くわけだが。
0020デフォルトの名無しさん05/01/19 20:20:19
sudo 命令をパスワード付きでperlから実行できますか?
0021デフォルトの名無しさん05/01/19 20:33:35
>>20
IPC::Open2なんか使えば出来るかも
0022デフォルトの名無しさん05/01/19 21:25:11
>>20
Expect なんか使えば出来るかも
sudo の -S オプションなんか使えば出来るかも
0023デフォルトの名無しさん05/01/19 23:06:28
唯一ついえることは、そんなことを聞くようなレベルでsudoは危険だぞ、と。
0024デフォルトの名無しさん05/01/19 23:39:20
ソケットで他のサイトを読み込む時、5秒経っても鯖の応答がなければFaild、とするにはどうすればよいですか?
0025デフォルトの名無しさん05/01/19 23:44:59
>>24
alarmとか使えばできると思うが、他のサイトってのがhttpなら
ソケットでごりごりやるよりLWP使ったほうが楽だよ。




0026デフォルトの名無しさん05/01/20 17:41:48
自身のモジュール名(ソースファイル名)を取得する関数ってありますか?
0027デフォルトの名無しさん05/01/20 17:48:01
ソースファイルのフルパスなら $0 でわかる(通常は)。
パッケージ名まで知りたいなら
 my ($package, $filename, $line) = caller();
あたりでどうなんだろ?
0028デフォルトの名無しさん05/01/20 17:52:36
>>26
__FILE__ とか?
0029デフォルトの名無しさん05/01/20 18:00:45
>>28
出ました。ありがとうございます!
0030デフォルトの名無しさん05/01/20 18:03:30
>>26, >>27
蛇足ですが、caller はサブルーチン呼び出し 1 段以上経てないと機能しませんから!
package foo;
sub bar {
 my ($package, $filename, $line) = caller;
 print "$package, $filename, $line\n";
}
bar();
print "$0\n"; # ついで
0031デフォルトの名無しさん05/01/20 18:16:00
おお、>>27さん>>30さんありがとうございます。
0032デフォルトの名無しさん05/01/21 06:21:29
forって10回までしか繰り返せないんでしょうか?
50回繰り返したら1回だけ動かしたいスクリプトがあるんですが、
どう書いたら良いかわかりませぬ。
気が向いたら教えてくださいm(_ _)m
0033デフォルトの名無しさん05/01/21 06:24:56
Σ(゚д゚) エッ!?
0034デフォルトの名無しさん05/01/21 07:00:36
>>32
> forって10回までしか繰り返せないんでしょうか?

なぜそう思い込み、決めつけ、疑いのないそのまっすぐな眼差しで
この愚劣極まる質問を発したのかを説明してくれると、みんな楽
しめると思います。ぜひお願いします。
0035デフォルトの名無しさん05/01/21 12:38:13
カモキター
0036デフォルトの名無しさん05/01/21 17:34:53
100%釣り
0037デフォルトの名無しさん05/01/21 19:16:13
くだらない質問でゴメン。
これでa.plを実行したら、表示される結果は1?2?
やっぱり1?
手元にperlを実行できる環境がないけど、至急回答が必要なの…。

./a.pl
#!/usr/bin/perl
my $a = "1";
require './b.pl';
print $a;



./b.pl
#!/usr/bin/perl
$a = "2";
1;
0038デフォルトの名無しさん05/01/21 21:02:54
>>37
2
0039デフォルトの名無しさん05/01/21 21:13:31
>>37
1
0040デフォルトの名無しさん05/01/21 21:17:02
ここは丸投げ厨には厳しいインターネッツですね
0041デフォルトの名無しさん05/01/22 22:55:29
お前らはPerlの標準モジュールでもあるswitchを使っているのか?
http://perldoc.jp/docs/modules/Switch-2.09/Switch.pod
0042デフォルトの名無しさん05/01/22 22:57:31
なにを突然
0043デフォルトの名無しさん05/01/22 23:10:09
>37
実行環境がなくてもすぐ手元で確認できるようにPerlのインタプリタを作ればいいじゃないか?
0044デフォルトの名無しさん05/01/22 23:12:15
>>37
undef
0045デフォルトの名無しさん05/01/22 23:33:42
>>41
知ってはいるけど使ったこと無い
大抵はラベルとブロックを組み合わせた方法で事足りるから
0046デフォルトの名無しさん05/01/23 00:36:42
リストで十分。
0047デフォルトの名無しさん05/01/23 01:23:37
多態で十分。
0048デフォルトの名無しさん05/01/23 02:59:42
今日暇だし標準モジュール全部使ってみるか
0049デフォルトの名無しさん05/01/23 15:20:24
早くも挫折か?
0050デフォルトの名無しさん05/01/24 11:26:14
CPANからHTML::モジュールをインストールしようとしたら、

cpan> install HTML
Warning: Cannot install HTML, don't know what it is.
Try the command

i /HTML/

to find objects with matching identifiers.

となります。どうやったらインストールできますか?
0051デフォルトの名無しさん05/01/24 11:31:23
cpan> i /HTML/
0052デフォルトの名無しさん05/01/24 11:38:52
i /HTML/
や
i /HTML::LinkExtor/
などとすると、
cpan> i /HTML::LinkExtor/
Module id = HTML::LinkExtor
DESCRIPTION Extract links from HTML documents
CPAN_USERID LWWWP (The libwww-perl mailing list <[email protected]>)
CPAN_VERSION 1.33
CPAN_FILE G/GA/GAAS/HTML-Parser-3.45.tar.gz
DSLI_STATUS RmpO (released,mailing-list,perl,object-oriented)
MANPAGE HTML::LinkExtor - Extract links from an HTML document
INST_FILE /usr/local/lib/perl5/site_perl/5.8.5/mach/HTML/LinkExtor.pm
INST_VERSION 1.33
と出ます。
要するにインストールするにはどうしたらいいのでしょうか?
0053デフォルトの名無しさん05/01/24 11:54:36
cpan> help install
0054デフォルトの名無しさん05/01/24 11:55:18
インストールされているってことですか?
0055デフォルトの名無しさん05/01/24 11:59:11
Sorry, can't speak English
0056デフォルトの名無しさん05/01/24 12:15:15
どうなんですか?
0057デフォルトの名無しさん05/01/24 12:18:23
No, am I. Read the warning message: "CANNOT INSTALL"
0058デフォルトの名無しさん05/01/24 13:03:59
ここはアメリカンなインターネットですね
0059デフォルトの名無しさん05/01/24 13:13:34
いぢめないで教えて下さい
0060デフォルトの名無しさん05/01/24 16:54:23
activeperl5.6.1
windowsXP

この環境で、aというフォルダ内にたくさんあるフォルダの中にある.txt/.csv
ファイルなどを全てaの直下に移すプログラムを書きたいのですが、どうすればいいでしょうか?

my @fold = glob 'aの中にあるフォルダだけを取得';
foreach (@fold){
my @sub_fold = glob 'aの中にあるフォルダの中にあるファイルを全て取得';
}
・・・ファイルの移動ってどうやるんですか?
一度元を読み込んで、任意の場所でopenをして自動でファイルを新規に開いて
そこに元になるものを流し込むみたいな方法以外にないのでしょうか?

ちょっと大変そうですねそれ;
0061デフォルトの名無しさん05/01/24 16:57:12
a\a.bat
move *.txt ..
move *.csv ..
0062デフォルトの名無しさん05/01/24 17:04:32
>>60
File::Find
File::Copy
00636005/01/24 19:16:08
>>62
File::Copyの解説(英語)を読む方がしんどいです。
本当に日本語訳以外のperl.docの説明書って直感的でないですね。

英語だろうが、関数の使い方くらいパットミでわかると思いマシ多雨。が、疎コマsだsファslgじゃkjgばsdgかjdbがshd

1から自分で書きます。それなら30プンですから
0064デフォルトの名無しさん05/01/24 19:28:42
1)エクスプローラで詳細表示、ファイルの種類で並べ換え、複数ファイル同時選択。
2)エクスプローラでF3を押してファイル名検索「*.txt;*.csv」検索結果をCTRL+A
0065デフォルトの名無しさん05/01/24 20:07:00
英語はよく判らないけれど、サンプル見れば何となく判る漏れは逝ってよしですか?
0066デフォルトの名無しさん05/01/24 20:10:13
最初にperlfaqを読まない者はきびしいな
0067デフォルトの名無しさん05/01/24 20:53:39
あんなの読めないなんて釣られないぞ〜
0068デフォルトの名無しさん05/01/24 21:22:02
あの程度が読めない奴が30プンで書いたああいやいや釣られないぞ〜
0069デフォルトの名無しさん05/01/24 21:28:26
SQLiteを使ってみたんだが素晴らしいなこれ。
0070デフォルトの名無しさん05/01/25 00:06:38
>>69
SQLite、使ってみたいと思ってます。
(いまのとこ、インストールしただけです。時間がなくて)
日本語、通りますか?
そのままじゃ通らないとしたら、urlエンコードなど
使ったりするのでしょうか?
よろしかったら、教えてください。
0071デフォルトの名無しさん05/01/25 00:47:15
すんません、ちょっと教えてください。

Perlで「"」ダブルクォート内の文字列を抜き出したいのですが
やり方がわかりません。
何か方法が有るのでしょうか?
0072デフォルトの名無しさん05/01/25 00:48:17
>>70
実際にやってみようとは思わないのか?
Shift_JISもEUC-JPも特に問題はないが、文字列操作関数を使うならUTF-8にしておいたほうが無難ではある。
0073デフォルトの名無しさん05/01/25 00:49:18
>>71
意味不明。パラフレーズせよ。
0074デフォルトの名無しさん05/01/25 00:56:28
>>71
while(/"(.*?)"/g) {print $1;}
0075デフォルトの名無しさん05/01/25 00:56:44
>>60
C:\path\to\a\dir /s /b *.txt | perl -nle "`move /y $_ C:\path\to\a`"
うはwwww
0076デフォルトの名無しさん05/01/25 01:02:32
71でつ。

>>74
それで1発で逝けました。
ありがとうございました。
0077デフォルトの名無しさん05/01/25 01:04:41
>>70
サンクスです。
>実際にやってみようとは思わないのか?
思いますぅ。ただ、クエリの初歩から勉強という段階で…。
近日中に、なんとかします!
0078デフォルトの名無しさん05/01/25 04:53:27
>>77
データベース板の SQLite スレもよろしく。
0079デフォルトの名無しさん05/01/25 07:02:14
WindowsでのPerlについて質問があります。
環境はWindows XP Pro SP2,perl, v5.8.2 built for cygwinです。

#! /usr/bin/perl
use Cwd;
my $dir1 = Cwd::getcwd();
print "$dir1\n";
my $infile = $ARGV[0];
open (INFILE, "$infile");
open (OUTFILE, ">result.txt");
print OUTFILE "hogehoge\n";

上記のようなスクリプトをコマンドラインで実行すると実行時のデ
ィレクトリがカレントディレクトリになりますよね。
それに対しperlコンパイラ(PAR,perl2exe,perlcc)でコンパイルし、
入力ファイルを実行ファイルにドラッグすると、カレントディレク
トリである$dir1はホームディレクトリになってしまい、その結果
OUTFILEもホームディレクトリに出来てしまいます。
1)INFILEと同じディレクトリにOUTFILEを作りたいので、現在の所
infileの最後の"/" or "\" までを取得してchdirしているのですが、
もう少しスマートな方法はないでしょうか?
2)ドラッグ時にカレントディレクトリがホームになるあたりについ
ての説明のソース等がありましたら教えてください。
よろしくお願いします。
0080デフォルトの名無しさん05/01/25 09:49:26
>>79
超一般論だけど、引きずって落とした時には、
その引きずり落としを行なうシステムが、
カレントディレクトリを決定するのではないか?

Winでそのあたりの設定をいじった記憶があるのだが、
もう何年も触ってないのでうろ覚え。

それから、ふつう、chdirなどせずに、OUTFILEを絶対パス
していしたりすると思うが。
0081デフォルトの名無しさん05/01/25 11:53:03
>1)INFILEと同じディレクトリにOUTFILEを作りたいので、現在の所
>infileの最後の"/" or "\" までを取得してchdirしているのですが、
>もう少しスマートな方法はないでしょうか?

それが一番スマート
0082デフォルトの名無しさん05/01/25 12:44:56
>>81
いや実は、少なくとも v5.6.1 では "$infile/.." で通る罠。
BEGIN {
 push @INC, "$0/..";
}
とかよくやる。
00838205/01/25 12:56:52
>>82 のディレクトリ取得方法が合法だと主張したり勧めたりはしませんので念のため。
実際、perl 以外のシチュエーション(たとえば ls './foo.txt/..' とか)は NG (Not a directory) なので処理系依存であることは間違いない。
0084デフォルトの名無しさん05/01/25 13:09:32
File::Basename
0085デフォルトの名無しさん05/01/25 21:29:35
>>82
んなあほな、と思ったらマジでできる。。。
5.8.4でもOKだった。

../で打ち消される部分は単純にスラッシュの数だけ数えてて、
間のフォルダ名は何書いても評価されてないみたいね。
0086デフォルトの名無しさん05/01/25 21:35:18
$cur = Cwd::getcwd();
open (OUT, ">>$cur/;,:?<>|/../foobar.txt");

こんなのまで許される。うわー。
0087デフォルトの名無しさん05/01/25 23:08:59
my($input_dir) = $ARGV[0] =~ /^(.*?)[^\/]+$/;
my($exec_dir) = $0 =~ /^(.*?)[^\/]+$/;

おれこうやって受け取ったファイルのディレクトリとか
実行ファイルのディレクトリいつもゲットしてchdirをめったに使わん。
0088デフォルトの名無しさん05/01/26 04:12:49
sjisのファイル名で漢字の第二バイトに\が含まれてて泣いた人いないっすか?

いや、いないならいいんですけど…
0089デフォルトの名無しさん05/01/26 06:48:10
しょっぱい質問なんですけど、
while(1){
A;
B;
サブルーチン();
C;
}
これサブルーチンに一回戻ってもう一度Aから動かしたら
ABCと動いて最後にもう一度Cを実行してしまうんですが、
二回目のCを実行しないようにするにはどうしたらいいんですかね?
サブルーチンで一旦別の場所に飛んでwhile(1)に戻って来た時に
サブルーチン呼び出し以下のコードを二度繰り返さないようにしたいんですが。
last;入れてもループ自体が終了しちゃってだめですた。
0090デフォルトの名無しさん05/01/26 07:10:44
フラグでも立てればいいだろ。
0091デフォルトの名無しさん05/01/26 08:15:24
後藤さん出番ですよ?
0092デフォルトの名無しさん05/01/26 10:25:34
イミフメ過ぎ
サブルーチンは毎回実行される(C; は繰り返さない)なら
while{A; B; サブルーチン();} と等価何じゃねーの

とりあえず next; 調べて来い
0093デフォルトの名無しさん05/01/26 10:27:55
>>89
なにいいたいのかよく分からん。
戻るっていまドコにいるんだよ?
て言うかあれか?再帰とかしてんのか?
せめてルーチンの中見せなさいよ。

0094デフォルトの名無しさん05/01/26 10:38:21
あー、やっと意味分かった。
1回目のループのみCを実行したいんだぬ?

while(1){
 $count ++;
 A;
 B;
 サブルーチン();
 $count == 1 and C;
}

とか?みたいな?
0095デフォルトの名無しさん05/01/26 10:58:33
Perlというよりは意味不明な文章の意味をみんなで
推理する謎解き大会になってきたな...

0096デフォルトの名無しさん05/01/26 11:28:26
>>94 ネタだとは思うが一応。
無限ループ内で整数をカウントアップさせっぱなしはやめれ。
2^32 回に一回実行されるし、そもそも符号付き整数のオーバーフローで roundup せずに例外投げる
アーキテクチャも広い世の中にはあるらしい。(直に見たことはないが)
0097デフォルトの名無しさん05/01/26 11:34:32
>>96
もとの記述が無限だったんだ。俺のせいじゃない。
0098デフォルトの名無しさん05/01/26 12:12:23
先生!
>>89が「すれ立てるまでもない…」でマルチしてるんですけど、
勝手に自己解決してるみたいです!
0099るんぱっぱ〜る05/01/26 12:19:48
どもです。

use Image::Size;

したいのですが、Can't locate auto/Image/Size/jpegsize.alって出ます。
ちゃんとスクリプト冒頭で

use FindBin qw($Bin);
use lib "$Bin/lib";

ってやってるのですが、なぜでしょうか?
(Size.pmは、(Perlスクリプト本体のディレクトリ)/lib/Imageの中にあります)

とんでもないヘマをやらかしてますか?
心優しいPerlコミュニティの皆様、教えてください…
0100デフォルトの名無しさん05/01/26 12:26:57
>>99
エラーメッセージに書いてあるようにないのはjpegsize.alなので、
Size.pmがあったからといってどうにもならんのだが。多分Size.pm
は読めていてその中でjpegsize.alを要求していると思われる。

まずはjpegsize.alがあるか確認すべきだろうな。
0101るんぱっぱ〜る05/01/26 13:02:07
jpegsize.alをググって、はいずりまわって探し出しました。そして、
Size.pmと同じ階層のディレクトリに置きました。

いざ実行してみると!
…同じエラーが出てだめでした。

alファイルというのはオートロードファイルということがわかったの
ですが、このオートロードというのは、どの時点で自動(オート)で
読み込まれる(ロード)でしょうか?スクリプトの実行時?

(そもそも画像データの扱いはImage::Magickを使うのが一般的なので
しょうか。)
■ このスレッドは過去ログ倉庫に格納されています