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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/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プログラミング板 ttp://pc11.2ch.net/php/ )

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

ttp://www.perl.org/get.html
● 2008/01/11現在の最新版: 5.10.0
● 2007/01/11現在の開発版: 5.9.5

前スレ
Perlについての質問箱 33箱目
http://pc11.2ch.net/test/read.cgi/tech/1192463997/

リンク集は>>2-3
過去スレは>>4 あたり
0002デフォルトの名無しさん2008/01/11(金) 00:07:47
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル] (追加)
最新のドキュメント: ttp://search.cpan.org/dist/perl/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi
perldoc.jp: ttp://www.perldoc.jp/
Perldoc.com: ttp://www.perldoc.com/
0003デフォルトの名無しさん2008/01/11(金) 00:08:12
[モジュール]
CPAN.com: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perlの小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8 Unicodeメモ]
ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004デフォルトの名無しさん2008/01/11(金) 00:08:28
>>1乙
0005デフォルトの名無しさん2008/01/11(金) 00:09:06
[過去スレ1]
1 ttp://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 ttp://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 ttp://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 ttp://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 ttp://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 ttp://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 ttp://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 ttp://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 ttp://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 ttp://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 ttp://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 ttp://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 ttp://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 ttp://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 ttp://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 ttp://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 ttp://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 ttp://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 ttp://pc8.2ch.net/test/read.cgi/tech/1126977805/
0006デフォルトの名無しさん2008/01/11(金) 00:09:38
[過去スレ2]
20 ttp://pc8.2ch.net/test/read.cgi/tech/1131286411/
21 ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 ttp://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 ttp://pc8.2ch.net/test/read.cgi/tech/1141742901/
24 ttp://pc8.2ch.net/test/read.cgi/tech/1146022352/
25 ttp://pc8.2ch.net/test/read.cgi/tech/1149259409/
26 ttp://pc8.2ch.net/test/read.cgi/tech/1153412251/
27 ttp://pc8.2ch.net/test/read.cgi/tech/1157874614/
28 ttp://pc8.2ch.net/test/read.cgi/tech/1162273941/
29 ttp://pc11.2ch.net/test/read.cgi/tech/1166708139/
30 ttp://pc11.2ch.net/test/read.cgi/tech/1173880452/
31 ttp://pc11.2ch.net/test/read.cgi/tech/1181500187/
32 ttp://pc11.2ch.net/test/read.cgi/tech/1186995713/
33 ttp://pc11.2ch.net/test/read.cgi/tech/1192463997/
0007デフォルトの名無しさん2008/01/11(金) 14:30:54
基本中の基本で申し訳ない。
リストを集合と見なして、和、積などの演算を提供するモジュールでポピュラーなのあったっけ?
0008デフォルトの名無しさん2008/01/11(金) 16:28:17
Set::Array
0009デフォルトの名無しさん2008/01/12(土) 00:24:18
CGI::Lite にある、url_encode 相当の関数って、
CGI.pm には入ってないので、自前でやるしかない。

で、あってる?

escapeHTML ってのはあるんだけどなぁ。
(= CGI::Lite で言うところの、browser_escape)
0010デフォルトの名無しさん2008/01/12(土) 02:47:40
>>9

use URI::Escape
じゃあ、いかんのかね?
0011 ◆TWARamEjuA NGNG?2BP(6825)
日本語Cookieのエンコードに助かりました。。>> URI::Escape
0012デフォルトの名無しさん2008/01/12(土) 22:32:26
パールのオブジェクト指向ってどうなのよ?
0013デフォルトの名無しさん2008/01/12(土) 22:46:33
使う方はそれほどでもないが、書くのは結構めどい
0014デフォルトの名無しさん2008/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");
0015デフォルトの名無しさん2008/01/12(土) 23:34:11
Perl使いからすれば、な。
他のOOPLを先にやっちゃった人だと、ちと辛くなる。
何かOOPL自体を実装してる気分になる。
0016デフォルトの名無しさん2008/01/12(土) 23:57:02
>>12
病的
0017デフォルトの名無しさん2008/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";
}

0018デフォルトの名無しさん2008/01/13(日) 08:24:31
またデバッグしないエラー隠蔽者か。
0019デフォルトの名無しさん2008/01/13(日) 11:00:49
>>17
まずは、ソースの頭にこの二行を追加してください。
あとは、ガイダンスに従ってプログラムを修正してください。

use string;
use warning;
0020172008/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] がなぜかできなくなるので使ってないです。
     ~~~
0021デフォルトの名無しさん2008/01/13(日) 17:53:45
落書き程度のプログラムならいいけど、
ちゃんとしたのを書くときはstrictとwarningプラグマをつけて書くようにしたほうがいいよ。

何かエラーが出るなら、コードにバグなりバグの原因が潜んでるってことだから。
0022デフォルトの名無しさん2008/01/13(日) 18:33:26
ひえええ(悲鳴)
0023デフォルトの名無しさん2008/01/13(日) 19:26:24
forでmyを使えばいいし、
そもそもPerlではforeachにしたほうがいい
strictとwarningsは 必 須
0024デフォルトの名無しさん2008/01/13(日) 19:35:12
foreach my $i (0 .. $#person)
0025172008/01/13(日) 19:47:54
>21-24
すみません。strict と warnings は使うようにします。foreach にもします。
>$person[$i] がなぜかできなくなるので使ってないです。
については、
my $person[$i] = Person->new();
 ↓
my @person = Person->new();
にしたらローカル変数使えました。どうもありがとうございました。
0026デフォルトの名無しさん2008/01/13(日) 21:21:49
for (my $i = 0; ......
0027 ◆TWARamEjuA NGNG?2BP(6825)
そもそも$i,$jが必要なのかなぁと思ったり。。。
0028デフォルトの名無しさん2008/01/13(日) 22:36:13
個人の力量に応じて色々書けるところがPerlのいいところなのに
マイルール押し付けすぎじゃね?
0029デフォルトの名無しさん2008/01/13(日) 22:38:32
力がないからこそエラーチェック機構に頼るべきだろう
0030デフォルトの名無しさん2008/01/13(日) 23:18:12
warningsは必ずしも使わないな。
あまり教条主義的になるのもよくない
0031デフォルトの名無しさん2008/01/13(日) 23:40:27
ここの人はPerlでプログラムをバリバリに書くの?
そこそこに大きくなりそうな時は、やっぱCにしようって思わない?
0032デフォルトの名無しさん2008/01/13(日) 23:41:31
>>17がアホなエラーを出してるからだろ。
0033デフォルトの名無しさん2008/01/14(月) 02:10:03
>31
Perlで書かなければならないときはPerlで書くし、
Cで書かなければならない時はCで書く。
0034デフォルトの名無しさん2008/01/14(月) 03:00:33
サンプルを作るのはPerlで、
速さが必要なときは、特定部分だけCにしてる
0035デフォルトの名無しさん2008/01/14(月) 04:53:03
>>30
それは分かってて使わないってことだろ?
上のは使うことすら知らなかったわけだから
0036デフォルトの名無しさん2008/01/14(月) 05:20:23
環境によっては使えない、なんてことも。
0037デフォルトの名無しさん2008/01/14(月) 11:29:21
そもそもPerlかCなんて、そんなに選択範囲小さくないです
0038デフォルトの名無しさん2008/01/14(月) 13:22:36
最近、PerlとRubyとElispで組み合わさって動くものばかり書いている。
PerlとRubyくらいまとめたい。
0039デフォルトの名無しさん2008/01/14(月) 16:39:51
少しプログラムで詰まりました。
ローカルサーバー上では
$i = rindex($add,"\\");
という入力をすることでうまく行きますが
借りてるサーバに上げる場合は
$i = rindex($add,"/");
と改変しなければ動かないプログラムがありまして、
出来れば、ローカルと借りてるサーバ両方でうまく処理が行くようにしたいのですけど、
いい方法ないでしょうか?
0040デフォルトの名無しさん2008/01/14(月) 16:56:40
多分パスのセパレータの違いが出てるんだろうけど・・
\か/に正規化すれば?もしくはシステムが使ってるパスのセパレータを取得してそれを使う

$add =~tr/\\/\//;
$i = rindex($add, "/");
0041デフォルトの名無しさん2008/01/14(月) 16:58:36
>>40
なるほど
ありがとうございます
0042デフォルトの名無しさん2008/01/14(月) 17:31:29
File::Spec
0043デフォルトの名無しさん2008/01/14(月) 18:33:59
CPANがエラーで動きません。どうすればよいのでしょうか?

やったこと
・相手のサーバーがダウンしてるのかと数箇所、変更しましたが変わらず
・数個のモジュールを試すが全部、同じエラー
-------------------------------------------
Fetching with LWP:
ftp://*****************
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:
ftp://*****************
Can't locate object method "new" via package "Net::FTP" at /usr/lib/perl5/5.8.6/CPAN.pm line 2251.
0044デフォルトの名無しさん2008/01/14(月) 20:27:57
>>43
> CPANがエラーで動きません。どうすればよいのでしょうか?

エラーを解消する。
0045デフォルトの名無しさん2008/01/14(月) 22:22:58
Perl/Tkってどうよ?
0046432008/01/15(火) 08:40:40
エラーの原因が特定できないんです。わかる方いますでしょうか?
0047デフォルトの名無しさん2008/01/15(火) 10:17:06
Can't locate object method "new" via package "Net::FTP"
0048432008/01/15(火) 10:24:27
Net::FTPがないってことで
cpan>install Net::FTP
でもエラーが出ますし,,,,
0049デフォルトの名無しさん2008/01/15(火) 10:53:25
CPAN使わないで入れろよ・・・
0050432008/01/15(火) 12:01:41
( ̄◇ ̄;)エッ

 yum? どこかに解説ありますでしょうか??
0051デフォルトの名無しさん2008/01/15(火) 13:09:26
>>48
> Net::FTPがないってことで
> cpan>install Net::FTP
> でもエラーが出ますし,,,,

誰にそんなデタラメ吹き込まれたの?
0052デフォルトの名無しさん2008/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.

0053432008/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:
ftp://ftp.kddilabs.jp/CPAN/authors/01mailrc.txt.gz
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:
ftp://ftp.kddilabs.jp/CPAN/authors/01mailrc.txt.gz
Can't locate object method "new" via package "Net::FTP" at /usr/lib/perl5/5.8.6/CPAN.pm line 2251.
0054432008/01/15(火) 13:15:38
>>52サン
 それっとド〜すれば... (o*。_。)oペコッ
0055432008/01/15(火) 13:33:54
52さんのヒントから...

rm -f /usr/lib/perl5/site_perl/5.8.6/Errno.pm
で、削除して成功しました。

よくわかりませんが...下記を参考にしました

ttp://www.nilab.info/zurazure2/000806.html
ttp://cyberlib.enterbrainz.com/1182508727.html
0056デフォルトの名無しさん2008/01/15(火) 15:56:02
ひどすぎる……「車のバックミラーが壊れかけてプラプラしているので
引きちぎって捨てました」的解決。
0057デフォルトの名無しさん2008/01/15(火) 15:59:14
>>54
お前の環境もお前が使っているLinuxディストリビューションの
パッケージシステムの管理体制も知らんからわからん。

エラーメッセージで示されているファイル群を見れば何が起きているかわかるだろ。
0058432008/01/15(火) 21:38:15
そんなの関係ねぇ!
そんなの関係ねぇ!
  ○∧〃
  / >
  < \
0059デフォルトの名無しさん2008/01/16(水) 02:13:39
Foo/Const.pmに存在する
Foo::Const;というパッケージから
Const以下をMainにExportし
Const::〜 というアクセス方法を提供するにはどのようにしたら良いでしょうか?
0060本物の432008/01/16(水) 12:49:10
>>58 は、私じゃないです
0061デフォルトの名無しさん2008/01/16(水) 18:38:57
require で複数のサブルーチンを取り込みたいんですが、

require 'subroutin1.pl';
require 'subroutin2.pl';

と書くとうまくいきません。
両方とも読み込む方法はないでしょうか?
0062デフォルトの名無しさん2008/01/16(水) 18:49:16
>>61
二つのファイルの最後に1;は書いた?
0063デフォルトの名無しさん2008/01/16(水) 18:58:35
「うまくいきません」(笑)
0064デフォルトの名無しさん2008/01/17(木) 00:29:25
エスパーの出番だ。
0065デフォルトの名無しさん2008/01/17(木) 01:30:06
なんか今朝から具合が悪いです。
いい薬はありませんか?
0066デフォルトの名無しさん2008/01/17(木) 02:17:45
>>65
http://life9.2ch.net/utu/
0067デフォルトの名無しさん2008/01/17(木) 08:35:36
>>61
取り合えず、下記を使え。
強い味方になるぞ

KCatch.pm/CGI エラーメッセージをブラウザに表示
http://www.kawa.net/works/perl/catch/news.html
0068デフォルトの名無しさん2008/01/17(木) 19:00:38
>>61>>67
普通に

use CGI::Carp qw(fatalsToBrowswr);

を書いておけば良いのと違うの?
0069デフォルトの名無しさん2008/01/17(木) 22:26:42
変数に読み込んだzipファイルを展開したいんですが、どうすればよいでしょうか。
Compress::Zlib::memGunzip()を試しましたが、zipのためかうまくいきませんでした。
(undefが返る)
すみませんが、お知恵を貸してください。
0070デフォルトの名無しさん2008/01/17(木) 22:45:49
Archive::Zip
0071692008/01/17(木) 23:06:41
>70
Archive::Zipでできますか?

use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
とりあえずこれで解決できそうです。

なぜか2chで聞くと自己解決につながる不思議!

Archive:;Zipもみてみますね。どうもありがとう
0072デフォルトの名無しさん2008/01/17(木) 23:14:42
>>69
日本語でおk?

変数に入ってるのは、zipファイルのファイル名 "なんとか.zip" が入ってるの?
それとも、メモリー中で圧縮された状態のデータそのものが入ってるの?

圧縮されたファイルを解凍したいだけなら、
google で 「perl zip 解凍」 を検索すれば参考になるコードがみつかるよ。
0073692008/01/17(木) 23:19:54
変数に入っているのは、zipデータのバイナリそのものです。
ファイル名やファイルハンドルではありません。
0074デフォルトの名無しさん2008/01/18(金) 10:35:27
http://yusukebe.com/tech/archives/20070803/124356.html
これ動かないんですがどうすればいいんですか?
0075デフォルトの名無しさん2008/01/18(金) 13:17:22
>>74
なぜ動かないのかをつきとめて、そこを動くように修正すると良い。
0076デフォルトの名無しさん2008/01/18(金) 14:32:22
ニコの仕様が変わったからじゃね?
使ったこと無いけどWWW::NicoVideoっつーのがCPANにあるから見てみれば
あとPlaggerにもぷらぎんあるかあr
0077デフォルトの名無しさん2008/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
0078デフォルトの名無しさん2008/01/18(金) 15:43:02
@argv = ( 1 .. 5);
@argv[1] = ( 1 ..5);
なデータがあるんですけど、
@argv[1]のリストの数を調べたいときは、どうするんですかね?

$#argv[1]とすると、syntx errorになります。
0079デフォルトの名無しさん2008/01/18(金) 16:05:46
それ以前の部分で理解が足りてないと思う
0080デフォルトの名無しさん2008/01/18(金) 16:19:28
>>78
> @argv[1] = ( 1 ..5);

これはどういう意味だ?

($argv[1]) = (1 .. 5)

と等価か?
0081デフォルトの名無しさん2008/01/18(金) 16:33:56
どういう意味も何も無いだろ・・・
0082デフォルトの名無しさん2008/01/18(金) 17:26:00
配列の要素にリストを代入したい ←無理
配列を表すらしい@を付ければできるんじゃね?

つーところかと
0083デフォルトの名無しさん2008/01/18(金) 17:46:32
ケチらずにリャマ本ぐらい読んでもよさそうなものだという気もするが。
0084デフォルトの名無しさん2008/01/18(金) 18:36:29
配列の要素に、"a b"のようなスペースを挟んでいるものがあります。
これをスペースでsplitして2次元配列にしたいのですが、
そのようなことはできませんか?
0085デフォルトの名無しさん2008/01/18(金) 18:41:25
できるよ
がんばれ
0086742008/01/18(金) 18:58:10
自己解決
Crypt::SSLeay入れたら動きました
0087デフォルトの名無しさん2008/01/18(金) 19:24:02
if文使うときif($a eq "a" or $a eq "b")みたいに同じ変数の中身を判定する部分をまとめる(/a|b/)みたいにする方法ってあります?
0088 ◆TWARamEjuA NGNG?2BP(6825)
$a =~ m(^[ab]$)
0089デフォルトの名無しさん2008/01/18(金) 20:11:10
>>87
あるけど、初心者はやるな。
0090デフォルトの名無しさん2008/01/18(金) 20:18:43
>>87
if ($a =~ m/^(a|b)$/)
if (grep { $a eq $_ } qw(a b))
:

好きなように書け
0091デフォルトの名無しさん2008/01/18(金) 20:21:36
確か[]より|のが速い
0092デフォルトの名無しさん2008/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)
0093デフォルトの名無しさん2008/01/18(金) 22:58:31
>>77
相反する(しかも管理しづらそうな)ことをする理由は分からないけど、
エラーメッセージの通りパッケージ名を付けるだけで怒られないようにはできる
use strict;
$main::hoge = "hoge";
print $main::hoge;
0094デフォルトの名無しさん2008/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ですます方法ないのかな?
0095772008/01/19(土) 14:49:54
77だが解決した。

#hoge.pl
use strict;
our($piyo);
require 'piyo.pl';
print $piyo;

#piyo.pl
$piyo='piyo'

0096デフォルトの名無しさん2008/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;
のように二次元配列にしたいのですが、どのようにすれば良いのでしょうか?
0097デフォルトの名無しさん2008/01/20(日) 00:30:36
my @list;
push @list, [map int, split] while(<DATA>);

__DATA__
11 12
13 14
15 16
0098デフォルトの名無しさん2008/01/20(日) 00:44:26
>>97
ありがとうございます。
コードを説明して頂けませんか?
0099デフォルトの名無しさん2008/01/20(日) 01:06:20
   ↑
本を読まない。
ネットを検索しない。
誰かが教えてくれるのをじっと待っているだけ。
つねに受身の態勢。
0100デフォルトの名無しさん2008/01/20(日) 01:09:23
本は持っていません。
ネットは検索しました。
回答を待っています。
受身の人間は質問しません。
0101デフォルトの名無しさん2008/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];
}

というコードを書いてるんですが、もっと奇麗な書き方はありませんか?
■ このスレッドは過去ログ倉庫に格納されています