Perlについての質問箱 34箱目
at TECH
1:デフォルトの名無しさん
08/01/11 00:07:22
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 URLリンク(pc11.2ch.net) )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
URLリンク(www.perl.org)
● 2008/01/11現在の最新版: 5.10.0
● 2007/01/11現在の開発版: 5.9.5
前スレ
Perlについての質問箱 33箱目
スレリンク(tech板)
リンク集は>>2-3
過去スレは>>4 あたり
2:デフォルトの名無しさん
08/01/11 00:07:47
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: URLリンク(www.site-cooler.com)
[本]
リャマ: URLリンク(www.oreilly.co.jp)
駱駝: URLリンク(www.oreilly.co.jp)
Effective Perl: URLリンク(www.ascii.co.jp)
クックブック: URLリンク(www.oreilly.co.jp)
Perl ベストプラクティス: URLリンク(www.oreilly.co.jp)
Perl Hacks: URLリンク(www.oreilly.co.jp)
[オンラインマニュアル] (追加)
最新のドキュメント: URLリンク(search.cpan.org)
perl5.8.xのドキュメント(一部): URLリンク(www.kt.rim.or.jp)
perl5.005_03 のドキュメント: URLリンク(www.kt.rim.or.jp)
日本語ドキュメント検索: URLリンク(www.cpan.jp)
perldoc.jp: URLリンク(www.perldoc.jp)
Perldoc.com: URLリンク(www.perldoc.com)
3:デフォルトの名無しさん
08/01/11 00:08:12
[モジュール]
CPAN.com: URLリンク(search.cpan.org)
河馬屋二千年堂: URLリンク(homepage3.nifty.com)
[テクニック]
Perlメモ: URLリンク(www.din.or.jp)
Perlのページ: URLリンク(homepage1.nifty.com)
Perlの小技: URLリンク(homepage3.nifty.com)
[Perl5.8 Unicodeメモ]
URLリンク(www.pure.ne.jp)
URLリンク(www.namazu.org)
URLリンク(www.lr.pi.titech.ac.jp)
4:デフォルトの名無しさん
08/01/11 00:08:28
>>1乙
5:デフォルトの名無しさん
08/01/11 00:09:06
[過去スレ1]
1 URLリンク(pc.2ch.net)
2 URLリンク(pc3.2ch.net)
3 URLリンク(pc2.2ch.net)
4 URLリンク(pc2.2ch.net)
5 URLリンク(pc5.2ch.net)
6 URLリンク(pc5.2ch.net)
7 スレリンク(tech板)
8 スレリンク(tech板)
9 スレリンク(tech板)
10 スレリンク(tech板)
11 スレリンク(tech板)
12 スレリンク(tech板)
13 スレリンク(tech板)
14 スレリンク(tech板)
15 スレリンク(tech板)
16 スレリンク(tech板)
17 スレリンク(tech板)
18 スレリンク(tech板)
19 スレリンク(tech板)
6:デフォルトの名無しさん
08/01/11 00:09:38
[過去スレ2]
20 スレリンク(tech板)
21 スレリンク(tech板)
22 スレリンク(tech板)
23 スレリンク(tech板)
24 スレリンク(tech板)
25 スレリンク(tech板)
26 スレリンク(tech板)
27 スレリンク(tech板)
28 スレリンク(tech板)
29 スレリンク(tech板)
30 スレリンク(tech板)
31 スレリンク(tech板)
32 スレリンク(tech板)
33 スレリンク(tech板)
7:デフォルトの名無しさん
08/01/11 14:30:54
基本中の基本で申し訳ない。
リストを集合と見なして、和、積などの演算を提供するモジュールでポピュラーなのあったっけ?
8:デフォルトの名無しさん
08/01/11 16:28:17
Set::Array
9:デフォルトの名無しさん
08/01/12 00:24:18
CGI::Lite にある、url_encode 相当の関数って、
CGI.pm には入ってないので、自前でやるしかない。
で、あってる?
escapeHTML ってのはあるんだけどなぁ。
(= CGI::Lite で言うところの、browser_escape)
10:デフォルトの名無しさん
08/01/12 02:47:40
>>9
use URI::Escape
じゃあ、いかんのかね?
11: ◆TWARamEjuA
08/01/12 22:00:08 BE:3485748-2BP(6825)
日本語Cookieのエンコードに助かりました。。>> URI::Escape
12:デフォルトの名無しさん
08/01/12 22:32:26
パールのオブジェクト指向ってどうなのよ?
13:デフォルトの名無しさん
08/01/12 22:46:33
使う方はそれほどでもないが、書くのは結構めどい
14:デフォルトの名無しさん
08/01/12 23:23:55
>>13
そか? むしろOOってこんなに簡単だったんだ、とオモタが。
[Hoge.pm]
package Hoge;
sub new {
my $class = shift;
return bless({@_}, $class);
}
sub fuga {
my ($self, $world) = @_;
print "$self->{hello}, $world\n";
}
1;
[hoge.pl]
use Hoge;
my $h = new Hoge(hello => "HELLO");
$h->fuga("WORLD");
15:デフォルトの名無しさん
08/01/12 23:34:11
Perl使いからすれば、な。
他のOOPLを先にやっちゃった人だと、ちと辛くなる。
何かOOPL自体を実装してる気分になる。
16:デフォルトの名無しさん
08/01/12 23:57:02
>>12
病的
17:デフォルトの名無しさん
08/01/13 02:18:45
構造体の要素をprintで表示させたいのですがどのようにしたらよいでしょうか?
struct Person => {
name => '$',
son => '@',
doughter => '@'
};
$person[$i] = Cell->new();
$person[$i]->son($j, 'taroh');
$person[$i]->doughter($k, 'hanako');
みたいにたくさんの人がいて、
人によって息子と娘の数は違います。
下の書き方だと表示できません。よろしくお願いします。
for ($i = 0; $i <= $#person; $i++){
print $person[$i]->name;
print ' son: ';
for ($j = 0; $j <= $#{$person[$i]->son($j)}; $j++){ ←この行でダメと怒られる
print $person[$i]->son($j);
}
print ' doughter: ';
for ($j = 0; $j <= $#{$person[$i]->doughter($j)}; $j++){
print $person[$i]->doughter($j);
}
printf "\n";
}
18:デフォルトの名無しさん
08/01/13 08:24:31
またデバッグしないエラー隠蔽者か。
19:デフォルトの名無しさん
08/01/13 11:00:49
>>17
まずは、ソースの頭にこの二行を追加してください。
あとは、ガイダンスに従ってプログラムを修正してください。
use string;
use warning;
20:17
08/01/13 17:18:11
for ($j = 0; $j <= $#{$person[$i]->son($j)}; $j++){ ←この行でダメと怒られる
↓
for ($j = 0; $j <= $#{$person[$i]->son; $j++){
で解決しました。
use string; を入れると、グローバル変数に文句を言われて、my を使ってみると
$person[$i] がなぜかできなくなるので使ってないです。
~~~
21:デフォルトの名無しさん
08/01/13 17:53:45
落書き程度のプログラムならいいけど、
ちゃんとしたのを書くときはstrictとwarningプラグマをつけて書くようにしたほうがいいよ。
何かエラーが出るなら、コードにバグなりバグの原因が潜んでるってことだから。
22:デフォルトの名無しさん
08/01/13 18:33:26
ひえええ(悲鳴)
23:デフォルトの名無しさん
08/01/13 19:26:24
forでmyを使えばいいし、
そもそもPerlではforeachにしたほうがいい
strictとwarningsは 必 須
24:デフォルトの名無しさん
08/01/13 19:35:12
foreach my $i (0 .. $#person)
25:17
08/01/13 19:47:54
>21-24
すみません。strict と warnings は使うようにします。foreach にもします。
>$person[$i] がなぜかできなくなるので使ってないです。
については、
my $person[$i] = Person->new();
↓
my @person = Person->new();
にしたらローカル変数使えました。どうもありがとうございました。
26:デフォルトの名無しさん
08/01/13 21:21:49
for (my $i = 0; ......
27: ◆TWARamEjuA
08/01/13 21:57:44 BE:3811875-2BP(6825)
そもそも$i,$jが必要なのかなぁと思ったり。。。
28:デフォルトの名無しさん
08/01/13 22:36:13
個人の力量に応じて色々書けるところがPerlのいいところなのに
マイルール押し付けすぎじゃね?
29:デフォルトの名無しさん
08/01/13 22:38:32
力がないからこそエラーチェック機構に頼るべきだろう
30:デフォルトの名無しさん
08/01/13 23:18:12
warningsは必ずしも使わないな。
あまり教条主義的になるのもよくない
31:デフォルトの名無しさん
08/01/13 23:40:27
ここの人はPerlでプログラムをバリバリに書くの?
そこそこに大きくなりそうな時は、やっぱCにしようって思わない?
32:デフォルトの名無しさん
08/01/13 23:41:31
>>17がアホなエラーを出してるからだろ。
33:デフォルトの名無しさん
08/01/14 02:10:03
>31
Perlで書かなければならないときはPerlで書くし、
Cで書かなければならない時はCで書く。
34:デフォルトの名無しさん
08/01/14 03:00:33
サンプルを作るのはPerlで、
速さが必要なときは、特定部分だけCにしてる
35:デフォルトの名無しさん
08/01/14 04:53:03
>>30
それは分かってて使わないってことだろ?
上のは使うことすら知らなかったわけだから
36:デフォルトの名無しさん
08/01/14 05:20:23
環境によっては使えない、なんてことも。
37:デフォルトの名無しさん
08/01/14 11:29:21
そもそもPerlかCなんて、そんなに選択範囲小さくないです
38:デフォルトの名無しさん
08/01/14 13:22:36
最近、PerlとRubyとElispで組み合わさって動くものばかり書いている。
PerlとRubyくらいまとめたい。
39:デフォルトの名無しさん
08/01/14 16:39:51
少しプログラムで詰まりました。
ローカルサーバー上では
$i = rindex($add,"\\");
という入力をすることでうまく行きますが
借りてるサーバに上げる場合は
$i = rindex($add,"/");
と改変しなければ動かないプログラムがありまして、
出来れば、ローカルと借りてるサーバ両方でうまく処理が行くようにしたいのですけど、
いい方法ないでしょうか?
40:デフォルトの名無しさん
08/01/14 16:56:40
多分パスのセパレータの違いが出てるんだろうけど・・
\か/に正規化すれば?もしくはシステムが使ってるパスのセパレータを取得してそれを使う
$add =~tr/\\/\//;
$i = rindex($add, "/");
41:デフォルトの名無しさん
08/01/14 16:58:36
>>40
なるほど
ありがとうございます
42:デフォルトの名無しさん
08/01/14 17:31:29
File::Spec
43:デフォルトの名無しさん
08/01/14 18:33:59
CPANがエラーで動きません。どうすればよいのでしょうか?
やったこと
・相手のサーバーがダウンしてるのかと数箇所、変更しましたが変わらず
・数個のモジュールを試すが全部、同じエラー
-------------------------------------------
Fetching with LWP:
fURLリンク(**)<)***************
Can't locate object method "new" via package "Net::FTP" at /usr/lib/perl5/5.8.6/CPAN.pm line 2251.
44:デフォルトの名無しさん
08/01/14 20:27:57
>>43
> CPANがエラーで動きません。どうすればよいのでしょうか?
エラーを解消する。
45:デフォルトの名無しさん
08/01/14 22:22:58
Perl/Tkってどうよ?
46:43
08/01/15 08:40:40
エラーの原因が特定できないんです。わかる方いますでしょうか?
47:デフォルトの名無しさん
08/01/15 10:17:06
Can't locate object method "new" via package "Net::FTP"
48:43
08/01/15 10:24:27
Net::FTPがないってことで
cpan>install Net::FTP
でもエラーが出ますし,,,,
49:デフォルトの名無しさん
08/01/15 10:53:25
CPAN使わないで入れろよ・・・
50:43
08/01/15 12:01:41
( ̄◇ ̄;)エッ
yum? どこかに解説ありますでしょうか??
51:デフォルトの名無しさん
08/01/15 13:09:26
>>48
> Net::FTPがないってことで
> cpan>install Net::FTP
> でもエラーが出ますし,,,,
誰にそんなデタラメ吹き込まれたの?
52:デフォルトの名無しさん
08/01/15 13:12:14
問題はこれじゃねの
> LWP failed with code[500] message[Errno architecture (i386-linux-thread-multi-2.4.21-27.0.2.elsmp) does not match executable architecture (i386-linux-thread-multi-2.6.9-34.elsmp) at /usr/lib/perl5/site_perl/5.8.6/Errno.pm line 11.
53:43
08/01/15 13:14:31
cpan> install Net::FTP
CPAN: Storable loaded ok
Going to read /root/.cpan/Metadata
Database was generated on Thu, 10 Jan 2008 22:37:46 GMT
CPAN: LWP::UserAgent loaded ok
Fetching with LWP:
fURLリンク(ftp.kddilabs.jp)
LWP failed with code[500] message[Errno architecture (i386-linux-thread-multi-2.4.21-27.0.2.elsmp) does not match executable architecture (i386-linux-thread-multi-2.6.9-34.elsmp) at /usr/lib/perl5/site_perl/5.8.6/Errno.pm line 11.
Compilation failed in require at /usr/lib/perl5/5.8.6/i386-linux-thread-multi/IO/Socket.pm line 17.
BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.6/i386-linux-thread-multi/IO/Socket.pm line 17.
Compilation failed in require at /usr/lib/perl5/5.8.6/Net/FTP.pm line 18.
BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.6/Net/FTP.pm line 18.
Compilation failed in require at /usr/lib/perl5/site_perl/5.8.6/LWP/Protocol/ftp.pm line 24.
]
Fetching with Net::FTP:
fURLリンク(ftp.kddilabs.jp)
Can't locate object method "new" via package "Net::FTP" at /usr/lib/perl5/5.8.6/CPAN.pm line 2251.
54:43
08/01/15 13:15:38
>>52サン
それっとド〜すれば... (o*。_。)oペコッ
55:43
08/01/15 13:33:54
52さんのヒントから...
rm -f /usr/lib/perl5/site_perl/5.8.6/Errno.pm
で、削除して成功しました。
よくわかりませんが...下記を参考にしました
URLリンク(www.nilab.info)
URLリンク(cyberlib.enterbrainz.com)
56:デフォルトの名無しさん
08/01/15 15:56:02
ひどすぎる……「車のバックミラーが壊れかけてプラプラしているので
引きちぎって捨てました」的解決。
57:デフォルトの名無しさん
08/01/15 15:59:14
>>54
お前の環境もお前が使っているLinuxディストリビューションの
パッケージシステムの管理体制も知らんからわからん。
エラーメッセージで示されているファイル群を見れば何が起きているかわかるだろ。
58:43
08/01/15 21:38:15
そんなの関係ねぇ!
そんなの関係ねぇ!
○∧〃
/ >
< \
59:デフォルトの名無しさん
08/01/16 02:13:39
Foo/Const.pmに存在する
Foo::Const;というパッケージから
Const以下をMainにExportし
Const::〜 というアクセス方法を提供するにはどのようにしたら良いでしょうか?
60:本物の43
08/01/16 12:49:10
>>58 は、私じゃないです
61:デフォルトの名無しさん
08/01/16 18:38:57
require で複数のサブルーチンを取り込みたいんですが、
require 'subroutin1.pl';
require 'subroutin2.pl';
と書くとうまくいきません。
両方とも読み込む方法はないでしょうか?
62:デフォルトの名無しさん
08/01/16 18:49:16
>>61
二つのファイルの最後に1;は書いた?
63:デフォルトの名無しさん
08/01/16 18:58:35
「うまくいきません」(笑)
64:デフォルトの名無しさん
08/01/17 00:29:25
エスパーの出番だ。
65:デフォルトの名無しさん
08/01/17 01:30:06
なんか今朝から具合が悪いです。
いい薬はありませんか?
66:デフォルトの名無しさん
08/01/17 02:17:45
>>65
URLリンク(life9.2ch.net)
67:デフォルトの名無しさん
08/01/17 08:35:36
>>61
取り合えず、下記を使え。
強い味方になるぞ
KCatch.pm/CGI エラーメッセージをブラウザに表示
URLリンク(www.kawa.net)
68:デフォルトの名無しさん
08/01/17 19:00:38
>>61>>67
普通に
use CGI::Carp qw(fatalsToBrowswr);
を書いておけば良いのと違うの?
69:デフォルトの名無しさん
08/01/17 22:26:42
変数に読み込んだzipファイルを展開したいんですが、どうすればよいでしょうか。
Compress::Zlib::memGunzip()を試しましたが、zipのためかうまくいきませんでした。
(undefが返る)
すみませんが、お知恵を貸してください。
70:デフォルトの名無しさん
08/01/17 22:45:49
Archive::Zip
71:69
08/01/17 23:06:41
>70
Archive::Zipでできますか?
use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
とりあえずこれで解決できそうです。
なぜか2chで聞くと自己解決につながる不思議!
Archive:;Zipもみてみますね。どうもありがとう
72:デフォルトの名無しさん
08/01/17 23:14:42
>>69
日本語でおk?
変数に入ってるのは、zipファイルのファイル名 "なんとか.zip" が入ってるの?
それとも、メモリー中で圧縮された状態のデータそのものが入ってるの?
圧縮されたファイルを解凍したいだけなら、
google で 「perl zip 解凍」 を検索すれば参考になるコードがみつかるよ。
73:69
08/01/17 23:19:54
変数に入っているのは、zipデータのバイナリそのものです。
ファイル名やファイルハンドルではありません。
74:デフォルトの名無しさん
08/01/18 10:35:27
URLリンク(yusukebe.com)
これ動かないんですがどうすればいいんですか?
75:デフォルトの名無しさん
08/01/18 13:17:22
>>74
なぜ動かないのかをつきとめて、そこを動くように修正すると良い。
76:デフォルトの名無しさん
08/01/18 14:32:22
ニコの仕様が変わったからじゃね?
使ったこと無いけどWWW::NicoVideoっつーのがCPANにあるから見てみれば
あとPlaggerにもぷらぎんあるかあr
77:デフォルトの名無しさん
08/01/18 15:33:05
いまいち頭の中でまとまってないけどuse strictを使い
cのヘッダファイルのように変数を一元管理するにはどうしたらいい?
例
##hoge.pl
use strict
$hoge = 'hoge';
print $hoge;
require 'piyo.pl';
print $hoge;
##piyo.pl
$hoge='piyo';
use strictコメントアウト時はhogepiyoだけど
Global symbol "$hoge" requires explicit package name at ./strict.pl line 3.
Global symbol "$hoge" requires explicit package name at ./strict.pl line 4.
Global symbol "$hoge" requires explicit package name at ./strict.pl line 6.
Execution of ./strict.pl aborted due to compilation errors.
と怒られるorz
78:デフォルトの名無しさん
08/01/18 15:43:02
@argv = ( 1 .. 5);
@argv[1] = ( 1 ..5);
なデータがあるんですけど、
@argv[1]のリストの数を調べたいときは、どうするんですかね?
$#argv[1]とすると、syntx errorになります。
79:デフォルトの名無しさん
08/01/18 16:05:46
それ以前の部分で理解が足りてないと思う
80:デフォルトの名無しさん
08/01/18 16:19:28
>>78
> @argv[1] = ( 1 ..5);
これはどういう意味だ?
($argv[1]) = (1 .. 5)
と等価か?
81:デフォルトの名無しさん
08/01/18 16:33:56
どういう意味も何も無いだろ・・・
82:デフォルトの名無しさん
08/01/18 17:26:00
配列の要素にリストを代入したい ←無理
配列を表すらしい@を付ければできるんじゃね?
つーところかと
83:デフォルトの名無しさん
08/01/18 17:46:32
ケチらずにリャマ本ぐらい読んでもよさそうなものだという気もするが。
84:デフォルトの名無しさん
08/01/18 18:36:29
配列の要素に、"a b"のようなスペースを挟んでいるものがあります。
これをスペースでsplitして2次元配列にしたいのですが、
そのようなことはできませんか?
85:デフォルトの名無しさん
08/01/18 18:41:25
できるよ
がんばれ
86:74
08/01/18 18:58:10
自己解決
Crypt::SSLeay入れたら動きました
87:デフォルトの名無しさん
08/01/18 19:24:02
if文使うときif($a eq "a" or $a eq "b")みたいに同じ変数の中身を判定する部分をまとめる(/a|b/)みたいにする方法ってあります?
88: ◆TWARamEjuA
08/01/18 20:10:12 BE:7841489-2BP(6825)
$a =~ m(^[ab]$)
89:デフォルトの名無しさん
08/01/18 20:11:10
>>87
あるけど、初心者はやるな。
90:デフォルトの名無しさん
08/01/18 20:18:43
>>87
if ($a =~ m/^(a|b)$/)
if (grep { $a eq $_ } qw(a b))
:
好きなように書け
91:デフォルトの名無しさん
08/01/18 20:21:36
確か[]より|のが速い
92:デフォルトの名無しさん
08/01/18 20:40:04
そんなはずがないだろうと思ってベンチ取ったが、やはりそんなはずはなかった。
use strict;
use Benchmark;
timethese(2000000, {
Alternation => sub{ my $x = "abcdefghijk"; my $y = $x =~ /(?:d|e|f)/ },
CharacterClass => sub{ my $x = "abcdefghijk"; my $y = $x =~ /[def]/ },
});
>> Benchmark: timing 2000000 iterations of Alternation, CharacterClass...
>> Alternation: 3 wallclock secs ( 2.45 usr + 0.00 sys = 2.45 CPU) @ 815328.17/s (n=2000000)
>> CharacterClass: 1 wallclock secs ( 1.41 usr + 0.00 sys = 1.41 CPU) @ 1422475.11/s (n=2000000)
93:デフォルトの名無しさん
08/01/18 22:58:31
>>77
相反する(しかも管理しづらそうな)ことをする理由は分からないけど、
エラーメッセージの通りパッケージ名を付けるだけで怒られないようにはできる
use strict;
$main::hoge = "hoge";
print $main::hoge;
94:デフォルトの名無しさん
08/01/19 06:20:50
>>93
相反するってのは例が悪かったって事で勘弁を。>>77の例でいうと$hogeはhoge.plでは変更しない。
#hoge.pl
use strict;
my($hoge);
$hoge='hoge';
require 'piyo.pl';
print $piyo;
#piyo.pl
$piyo='piyo'
でhoge.plを実行すると
Global symbol "$piyo" requires explicit package name と怒られる。
#piyo.pl
package piyo
を追加して
#hoge.pl
print $piyo::piyo;
とすれば怒られないけど hoge.pl内$piyoですます方法ないのかな?
95:77
08/01/19 14:49:54
77だが解決した。
#hoge.pl
use strict;
our($piyo);
require 'piyo.pl';
print $piyo;
#piyo.pl
$piyo='piyo'
96:デフォルトの名無しさん
08/01/20 00:08:53
11 12
13 14
15 16
のように、1行に2つのデータを持ったファイルがあります。
これを、
list[0][0] = 11;
list[0][1] = 12;
list[1][0] = 13;
list[1][1] = 14;
list[2][0] = 15;
list[2][1] = 16;
のように二次元配列にしたいのですが、どのようにすれば良いのでしょうか?
97:デフォルトの名無しさん
08/01/20 00:30:36
my @list;
push @list, [map int, split] while(<DATA>);
__DATA__
11 12
13 14
15 16
98:デフォルトの名無しさん
08/01/20 00:44:26
>>97
ありがとうございます。
コードを説明して頂けませんか?
99:デフォルトの名無しさん
08/01/20 01:06:20
↑
本を読まない。
ネットを検索しない。
誰かが教えてくれるのをじっと待っているだけ。
つねに受身の態勢。
100:デフォルトの名無しさん
08/01/20 01:09:23
本は持っていません。
ネットは検索しました。
回答を待っています。
受身の人間は質問しません。
101:デフォルトの名無しさん
08/01/20 01:15:34
多次元配列の操作についてなんですが、
@aと@bによる二次元の配列@xを作る際に、
for $i (0..$#a){
$x[0][$i] = $a[$i];
}
for $i (0..$#b){
$x[1][$i] = $b[$i];
}
多次元配列 @x の i 行目の配列を一次元の配列 @c に移し変えるのに、
for $j (0..$#{$x[$i]}){
$c[$j] = $x[$i][$j];
}
というコードを書いてるんですが、もっと奇麗な書き方はありませんか?
102:デフォルトの名無しさん
08/01/20 01:38:01
>@aと@bによる二次元の配列@xを作る
@x = (\@a, \@b);
>多次元配列 @x の i 行目の配列を一次元の配列 @c に移し変える
@c = @{@x[i]};
「続・初めてのPerl」のような参考書をお読みください。
103:デフォルトの名無しさん
08/01/20 03:24:16
「多次元配列」、「二次元配列」、その過てる認識がドツボへといざなう
104:デフォルトの名無しさん
08/01/20 05:56:49
>>102
ありがとうございました。
参考書を買って一通り読んだほうがよさそうですね。
アドバイスありがとうございました。
105:デフォルトの名無しさん
08/01/20 09:17:59
>>102
× @c = @{@x[i]};
○ @c = @{$x[i]};
106:デフォルトの名無しさん
08/01/20 22:02:02
>>100
ム板で言う「受け身」は「わからんから教えてくれ」の事だぞコラ
hoge や fuga を試したけど moge や munya のエラーになって
困っています。xxx.net や ○●の本を確認したけれど××の所
の通りで間違っていないコードかと思ったんですが。タスケテ
の様に複数の試行錯誤と複数の情報確認をひっさげてポストしてみ
107:デフォルトの名無しさん
08/01/21 10:27:18
二次元配列?
Perlの配列の要素はスカラーですよ?
108:デフォルトの名無しさん
08/01/21 10:59:15
いま本読んでるところだよきっと!
109:デフォルトの名無しさん
08/01/21 12:22:47
>>91
速さを求めるなら、正規表現の | より、正規表現使わないで or のほうが速いぞ
110:デフォルトの名無しさん
08/01/21 22:29:32
>>97
やっと理解できたよ。map なんて昔からあった?
111:デフォルトの名無しさん
08/01/21 22:32:21
大昔から
112:デフォルトの名無しさん
08/01/22 06:44:24
昔っていうと範囲が曖昧だけど、とりあえず前世紀の産物だしな。
113:デフォルトの名無しさん
08/01/22 06:46:56
僕らが生まれてくるずっとずっと前にはもう
114:デフォルトの名無しさん
08/01/22 07:31:26
>>110
perl4 には無かった記憶が。perl5 からだとすると
URLリンク(search.cpan.org)
> 5.000alpha1 1993-Jul-31
> 5.000 1994-Oct-17
115:デフォルトの名無しさん
08/01/22 10:44:57
map, grep を知ると、出来るだけそれを使ってプログラムを作りたくなる。
116:デフォルトの名無しさん
08/01/22 13:29:05
>115
なんとなくだが、その気持ちは分かった気がする。
117:デフォルトの名無しさん
08/01/22 13:39:17
そして後で泣く
118:デフォルトの名無しさん
08/01/22 14:18:17
>>115
そのままLISPerになっちゃえばいいのにw
119:デフォルトの名無しさん
08/01/22 17:29:54
>>115
前にも同じこと言ったけど中二病だよね。あれって。
120:デフォルトの名無しさん
08/01/22 17:31:34
forのかわりにmap使うボケが多すぎたので、voidコンテクストなるものが導入されました。
121:デフォルトの名無しさん
08/01/22 17:59:14
昔はgrep/mapのほうがforより速かったからなぁ。
122:デフォルトの名無しさん
08/01/22 18:23:02
たしかに。多言語に書き換えるときに泣くよね。
perl はプロトタイプとして使うな。
有る程度ロジックの検証ができたらCなりjavaなりに書き換える。
だから perl 固有すぎる命令は使いたくないね。
map のつかいかたを一所懸命覚えても、何の糧にもならないし。
123:デフォルトの名無しさん
08/01/22 18:24:23
122s/多言語/他言語/p
124:デフォルトの名無しさん
08/01/22 19:22:39
また for厨 が暴れてるのか
125:デフォルトの名無しさん
08/01/22 19:58:09
perl/Tkの参考になるサイトおしえて
126:デフォルトの名無しさん
08/01/22 20:18:47
perl/Tkもいちじはやってたけど、Qt始めてから使わなくなった。
127:デフォルトの名無しさん
08/01/22 20:19:10
でっていう
128:デフォルトの名無しさん
08/01/23 20:45:35
Google検索でいっぱい出てくるじゃん
129:デフォルトの名無しさん
08/01/23 21:13:32
構造体の要素に多次元配列を使いたいです。
struct A => {
aaa => '@', ←ふつうの配列
bbb => '@' ←これを多次元配列にしたい
};
$A->aaa(0, 'a0000'); ←これと
$A->aaa(1, 'a1111'); ←これはよいとして
$A->bbb(0, 0, 'b0000'); ←これはダメ
$A->bbb(0, {0, 'b0000'}); ←これもダメ
$A->bbb({0, 0}, 'b0000'); ←これもダメ
どう書けばよいですか?お願いします。
130:デフォルトの名無しさん
08/01/23 21:22:35
perlに多次元配列なんてものはないが、
配列のリファレンスの配列にすればいい。
131:デフォルトの名無しさん
08/01/23 21:26:06
>>129
$A->aaa->[0] = 'a0000';
$A->bbb->[0][0] = 'b0000';
こんなんじゃあかんの?
132:129
08/01/23 22:22:24
レスどうもありがとうございます。
>130
perlに多次元配列はないという噂は聞きますが
これまでCと同じ感覚で使ってました。プログラマじゃないので許してください。
>131
そんな記述できるのですね。
やりたかったことです。ありがとうございました。
133:デフォルトの名無しさん
08/01/23 23:15:25
言葉として、n次元配列という時はある。配列のリファレンスの配列、とか言いたくないよ!
134:デフォルトの名無しさん
08/01/23 23:36:07
一人っきりの部屋で、言う機会もないくせに。
135:デフォルトの名無しさん
08/01/24 00:08:28
意味は通じるから多次元配列でも問題ない。
リファのリファとか言うより伝わりやすい。
厳密なのは仕様書書きとかがやればいい。
136:デフォルトの名無しさん
08/01/24 00:14:57
多次元配列言う奴は多次元配列としてしか使わんからなあ
137:デフォルトの名無しさん
08/01/24 00:37:18
$hash{'a','b'}でハッシュを二次元配列のように使うとかなかった?
138:デフォルトの名無しさん
08/01/24 00:42:42
普通の配列でやればいい
139:デフォルトの名無しさん
08/01/24 00:48:09
>>137
それはPerl5で非推奨になった
140:デフォルトの名無しさん
08/01/24 01:26:30
>>137
$hash{'a-b'}みたいなもんだし多次元のつもりでやると想定外のことになりうるからあまり勧められんね。
keysとかで簡単に拾うこともできんし。
141:デフォルトの名無しさん
08/01/24 01:32:05
unix epoch より過去を unix time で扱うにはどうすればいいでしょうか。
いまテストしてる環境はWinXP SP2 (5.1.2600) + ActivePerl 5.8.8 です(一応)。
142:デフォルトの名無しさん
08/01/24 02:20:59
ビッグバンより前の宇宙
143:デフォルトの名無しさん
08/01/24 03:09:03
>>141
そもそもunixtimeの定義からして無理だろ。
負の数を正の整数で表現するにはどうしたらいいですか? みたいなもんだ。
自前の日付表現方法考えろ。
144:デフォルトの名無しさん
08/01/24 03:38:28
>>143
どうもです。
unix time定義の厳密な定義はわかりませんが、仮に整数のみであるとしても
負数から計算してタイムスタンプなり配列なりを返す実装はありそうかなと思って。
もうちょっと探してみて、なさそうなら他の手を考えます。
145:デフォルトの名無しさん
08/01/24 03:40:23
訂正:「整数のみ」→「正の整数のみ」
146:デフォルトの名無しさん
08/01/24 05:18:37
Perlでオススメのメーリングリストってあります?
検索したら、下記かな?と思いましたが、終わってるようですし。
URLリンク(bug.org)
147:デフォルトの名無しさん
08/01/24 10:42:03
>>135
分かってる人間どうしで言うのは構わんけど
ここで「多次元配列使いたい」って質問してくる人はたぶん分かってないと思うぞ
148:デフォルトの名無しさん
08/01/24 11:06:45
>>146
なんの話題をしたいかによる。
今はどこも過疎ってるけどね。
149:デフォルトの名無しさん
08/01/24 11:30:31
MLは使わなくなったなぁ。
ダイアルアップ時代の産物だと感じるねぇ
150:デフォルトの名無しさん
08/01/24 11:50:56
>>149
ダイアルアップ時代になって、メールをプロバイダに取りに行くように
なって利点が無くなったもんだよ。
151:デフォルトの名無しさん
08/01/24 12:46:53
>>150
じゃその利点があったとかいう時代に
日本で活動していたMLなんていくつあったの?
152:デフォルトの名無しさん
08/01/24 13:46:59
>>151
MLはクローズドな空間を構成するために使われていたから、日本でいくつなんて、
数えられるわけないだろ。
とりあえず私は、あるとき、メールがオフィスタイムに平均して3秒に1通来る状態に
なって、biff - メール到来通知エージェントがつねにフラグを立てている状態になっ
て、調べてみると72のMLに入っていたので、入っているMLを整理したことがある。
あとになって調べてみると、POPが出てきた時に、「これはMLを殺すぞ」と
指摘していた人がいるんだよね。まあ、その通りになったわけで。
153:デフォルトの名無しさん
08/01/24 14:26:54
読みづらい文章だな
154:デフォルトの名無しさん
08/01/24 14:47:16
何の話ししてんだろ
155:デフォルトの名無しさん
08/01/24 15:10:25
はなししとは?
156:デフォルトの名無しさん
08/01/24 15:26:35
プログラマってこういうツッコミ好きなやつほんと多いよな
157:デフォルトの名無しさん
08/01/24 15:42:03
以上、俺の自作自演
158:デフォルトの名無しさん
08/01/24 17:48:43
えー、続きましてー
159:デフォルトの名無しさん
08/01/24 19:14:46
今でもML使ってるよ。昔に比べると流量少ないけど。
ダイアルアップとは関係なく、コミュニティ・ツールが変わったのが大きい気がする。
perlな方々はblogやIRCで済ませてる人が多いみたいだし。
慣れてない人には不親切かもしんない。
160:デフォルトの名無しさん
08/01/24 19:30:09
ML衰退は他にもウイルスとか迷惑メールの増加の時期とシンクロしてた様にも。
しかし投稿を一気に落として、必要な書き込み作ってアップロードって作業は
時間が限られた電話回線時代にはマッチしてた様に思うね。
今、特に常時接続になってからはMLでもなんでもクライアントでは
データコピーを持たない、ASPスタイルこそが時代の流れと
なっていったと思う。
オンライン辞書の類は地味ながら個人的にはここ10年でも
指折りの革新的なツールだと思ってるお。
161:デフォルトの名無しさん
08/01/24 20:00:53
特殊変数だとおもうのですが、$,の使い方を教えてください。
イマイチよくわかりません。
$,=" ";
としても
すべての変数に空白がつくわけではないようですし・・・
162:デフォルトの名無しさん
08/01/24 20:13:50
perlvar嫁
163:デフォルトの名無しさん
08/01/24 22:49:43
google 「perl 特殊変数」
164:デフォルトの名無しさん
08/01/25 13:05:41
ircは日本語perlのコミュが会話に入りづらい雰囲気
165:デフォルトの名無しさん
08/01/25 13:07:32
↑お前、日本語が下手だから会話に来なくてけっこう
166:デフォルトの名無しさん
08/01/25 15:43:02
スレリンク(tech板)
167:デフォルトの名無しさん
08/01/25 18:59:19
>>161
暇だから答えよう。
$, = ' ';
@a = ('a'..'f);
print @a;
みたいな時に配列の間に半角スペースが入るってだけ。
print "@a";
の間には $" で指定。こっちはデフォで半角スペース入ってる。
168:デフォルトの名無しさん
08/01/25 20:38:17
たしかにircは内輪ネタが分からない奴はお断りの雰囲気がある
169:デフォルトの名無しさん
08/01/25 21:22:36
join関数の方が高速
170: ◆TWARamEjuA
08/01/26 11:31:21 BE:5881469-2BP(6825)
ユリウス使うと良いのかもかも。@うに刻以前
171:デフォルトの名無しさん
08/01/26 13:20:13
初歩的な質問ですがお願いします。
open関数でテキストドキュメントを読み込んで
表示するという初歩の操作を試しているのですが、
"invalid argument "というメッセージがでてきて
ファイルが開けません。
スクリプトは単純ですが以下の構造です。
open(F , ">C:\Perl\text.txt") || die " stupid : $!\n";
while(<F>) {
print;
}
close(F);
ファイルはtext.txtです。パスも間違っていません。どうすれば
よろしいでしょうか?
172:デフォルトの名無しさん
08/01/26 13:25:15
一冊入門書を(仮にわからないとこがあっても)通読した方が良いよ。
英語で言うと、I is bookみたいな状態。
173:デフォルトの名無しさん
08/01/26 13:30:38
>>171
print ">C:\Perl\text.txt", "\n";
とでもして、おまいが何をしようとしているかを確認してみろ。
174:デフォルトの名無しさん
08/01/26 18:39:26
基本的なことかもしれませんが…
Windowsでながーい(256文字以上の)ファイル名使っている場合に
ファイル名は取得できるのですが
そのファイルサイズなどを取得する方法がわかりません。
短いファイル名ならサイズの取得も可能なのですが
非常に長いファイル名だとサイズに0が帰ってきます。
もしよかったらサイズ取得の方法をヒントだけでも結構ですので
教えてもらえませんか?
絶対できるのは間違いないとは思うのですが…
175:デフォルトの名無しさん
08/01/26 19:34:11
WebProgのテンプレをこっちにも入れたいな。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
176:174
08/01/26 20:13:11
大変申し訳ありません。
あの後、考えてみたら
Win32::UTCFileTime
を使ってなんとかなりそうな雰囲気です。
少なくともいくつかの例ではうまくいきました。
お騒がせして大変申し訳ありませんでした。
もうちょっと自分で考えないとだめですね…
177:デフォルトの名無しさん
08/01/26 20:17:23
>>171
こりゃひどいね。
キミは、自分が何をしたいのかが分かってないみたいだね。
どこをどう直せばいいのか、教えるのは簡単だが
それはキミにとって良くない。
入門書を読むことをオススメするよ。
178:デフォルトの名無しさん
08/01/26 20:58:43
>>177
そういわずに教えてあげなよ
179:デフォルトの名無しさん
08/01/26 21:00:22
>>167
ありがとう。
これからはperldoc読みます。
プログラム言語は奥が深い。
三十路にはキツイザンス
180:デフォルトの名無しさん
08/01/26 21:26:32
下のファイルを読んで、XXX, YYY, ZZZのいずれかでなければ
値を取り込むプログラムを作りたいです。
====
AAA
BBB
CCC
……
====
my @prohibit = ('XXX', 'YYY', 'ZZZ');
my @keep;
if ($_ !~ /$prohibit[0]/ && $_ !~ /$prohibit[1]/ && $_ !~ /$prohibit[2]/ ) {
push @keep, $_;
}
とすればまあできるんですが、
my @prohibit に禁止文字の追加や削除をしたときに困ってしまいます。
if ($_ !~ /@prohibit/ ) はエラーになります。
下の $ifif を作っても if 文が中身を把握してくれません。どのようにすればよいでしょうか?
my $ifif;
foreach my $i (0 .. $#{@prohibit}) {
$ifif = $ifif . sprintf " \$prohibit\[$i\] =\~ \/\^%s\/ \&\&", $prohibit[$i];
}
$ifif = $ifif . ' 0 == 0';
181:デフォルトの名無しさん
08/01/26 21:40:32
なんか宿題みたいなの多いなあ。
半年授業をサボってたんだから、少しは自分で勉強しろよ。
182:デフォルトの名無しさん
08/01/26 21:41:02
>>180
my $regex = join '|', map quotemeta, @prohibit;
if ($_ !~ /$regex/) { ...
183:デフォルトの名無しさん
08/01/26 22:29:02
>>170
ありがとうございます。
単純なインクリメントで日単位の処理をしたいだけだったので
Date::Calc(::Object)で対応しました、という報告をしにきたところでした。
ユリウス暦とはまったく思いつきませんでしたが、Date::CalcはA.D.以降なので
ユリウス→グレゴリオ変換のほうが対応できる範囲が広がりますね。
まぁ20世紀を処理するだけなのでどっちもオーバースペックですがw
184:180
08/01/27 00:09:34
>182
ありがとうございました!!
185:デフォルトの名無しさん
08/01/27 00:35:54
Perlインストールしたんだけど
どうやってアンインストールしたらいいの?
フォルダ削除だけで平気?
186: ◆TWARamEjuA
08/01/27 00:48:49 BE:2723055-2BP(6825)
>>180
こういうのもありかしら?
for my $value (<DATA>){
%prohibit = map +($_, 1), qw|XXX YYY ZZZ|;
push @keep, $_ unless exists prohibit{$_};
}
exit;
__END__
AAA
GGG
ZZZ
YYY
ZZZ
XXX
HHH
>>183
月の満ち欠けを画像出力するときに、ユリウスを使って計算をしたことがありましたから(゚∀゚)アヒャ
>>185
念のためrootタソになって、# rm -rf 推奨♪
187:デフォルトの名無しさん
08/01/27 00:50:04
ディレクトリではなくフォルダと言うあたりWindowsか?
188: ◆TWARamEjuA
08/01/27 00:50:58 BE:4574467-2BP(6825)
>>186
なんかおかしいよな(´・ω・`)
my %prohibit = map +($_, 1), qw|XXX YYY ZZZ|;
my @keep;
for my $value (<DATA>){
push @keep, $value unless exists prohibit{$value};
}
exit;
__END__
AAA
GGG
ZZZ
YYY
ZZZ
XXX
HHH
189:デフォルトの名無しさん
08/01/27 01:02:24
>>187
そうなんです
まだ高校生でで思うように開発環境整えられないからさ
190:デフォルトの名無しさん
08/01/27 01:02:31
Regexp::Assembleでいいと思うよ。
191:デフォルトの名無しさん
08/01/27 03:03:57
perlの開発環境なんて本体と標準のメモ帳ありゃできるっしょ。
>>188
なんかあえて難解な書き方にしてるような。
192:デフォルトの名無しさん
08/01/27 03:48:53
読めるようになってくると戻り値を変数に入れるのが面倒になってくるよ。
Winだとインストールが面倒(できない)モジュールがあったりするよ。
まぁ中級後半くらいまでは充分だと思うけど。
193:デフォルトの名無しさん
08/01/27 11:12:16
そのへんがPerlのまずいところでもある。
モジュール頼みのPerlなのに、モジュールがインストールできなくて
ユーザーが離れていってしまうという。
194:デフォルトの名無しさん
08/01/27 12:27:43
かと言って初心者にいきなりUNIX系OSのPCをひとつ用意しろとか
Winにcygwinを導入してPerl使えとかいうのも酷な感じもする。
まあcygwin perlもCPANで入れられないモジュールもあるらしいけどなあ。
195:デフォルトの名無しさん
08/01/27 15:30:12
VMwarePlayerで
196:デフォルトの名無しさん
08/01/27 15:47:07
サードパーティのPPM含めりゃ大抵の物はあるだろ。
197:デフォルトの名無しさん
08/01/27 17:12:33
colinuxで
198:デフォルトの名無しさん
08/01/27 18:49:21
VC++入れてnmakeとclにパス通してCPAN.pmを中心に使ってるが
しばしばmake中にエラーが出るので、その場合にはPPMも使ってる。
CPAN.pmとPPMを併用することによるエラーも出てきてるのかもしれないが、
いずれにせよWinにおけるモジュール管理のノウハウをもうちょっと蓄積したいね。
199:デフォルトの名無しさん
08/01/27 20:08:59
ActivePerl 5.8.8.822を入れたんですが、ppmを使おうとすると
failed: unable to open database file(1)
と表示されて起動できません。
ppm-shellは起動できるんですがinstallの段階で同じエラーになります。
どうやらユーザー名にマルチバイト文字が入っているせいらしいんですが
エラーを避ける方法はありませんか?
200:デフォルトの名無しさん
08/01/27 22:50:58
Perl/Tkでスプレッドシートの Widgetを作成したいのですが、
ActivePerlでどのモジュールを利用するのか、分かりません。取り敢え
ず、Tk::TableMatrixをppmのコマンドでinstall Tk-TableMatrixでインストールし
ましたが、サンプルのコードが動きません。ActibePerlのバージョンは
This is perl, v5.8.7 built for MSWin32-x86-multi-threadとなって
います。
調べていたらuse Tk::TableMatrix;の1行のみのソースでもエラーが出
ます。エラーの内容は、下記です。
Had to create Tk::XlibVtab unexpectedly at C:/ActivePerl/lib/DynaLoader.pm line 253.
Use of uninitialized value in subroutine entry at C:/ActivePerl/lib/DynaLoader.pm line 253.
15.pl syntax OK
インストールに失敗しているのでしょうか? Perl/Tkの他の
Widgetについては、ボタン、ラベル、メニューについては動きます。全
てのテストはしていませんが。ppmのqueryではTk-XlibVtabはありませ
ん。searchでは、ActivePerlのリポジトリーにはありません。
そもそもが、スプレッドシートを使う時に、ActivePerlでどのモジュー
ルが必要なのかと言う事も理解していません。
恐れ入りますが、分かる方がいらっしゃいましたら、ご教授願います。
Perl/Tkでスプレッドシートが出来なければ、わざわざPerl/TkのGUIを
覚える必要もありませんから。宜しくお願いします。
201:デフォルトの名無しさん
08/01/28 00:05:07
>>199
環境変数設定し。
新:知らないことがあってもへっちゃらさ: ActivePerl の ppm が起動しないのです
URLリンク(riku.justblog.jp)
202:デフォルトの名無しさん
08/01/28 19:37:31
なんでこうなるのかよく分からないので教えてください。
■テスト1
・CORE::GLOBAL::exitは呼ばれず、終了してしまいます。
#!/usr/bin/perl
use strict;
*CORE::GLOBAL::exit = sub {printf "exit(%s)\n",join(",",@_);CORE::exit(@_)};
exit(1);
1;
■テスト2
・事前にSample.pmを作成します。
package Sample;
use strict;
use warnings;
*CORE::GLOBAL::exit = sub {printf "exit(%s)\n",join(",",@_);CORE::exit(@_)};
1;
・CORE::GLOBAL::exitが呼ばれます。
#!/usr/bin/perl
use strict;
*CORE::GLOBAL::exit = sub {printf "exit(%s)\n",join(",",@_);CORE::exit(@_)};
exit(1);
1;
■動作確認環境
This is perl, v5.8.5 built for i386-linux-thread-multi
This is perl, v5.8.8 built for x86_64-linux-thread-multi
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4947日前に更新/153 KB
担当:undef