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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/03/14(水) 22:54:12
"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/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3

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

リンク集は>>2-3
過去スレは>>4
0596デフォルトの名無しさん2007/05/16(水) 14:18:25
104や交番は仕事だけど、ここはただの掲示板だ
0597デフォルトの名無しさん2007/05/16(水) 14:58:15
道に迷っている人に通りすがりの人が「地図板はあそこにある」と言ったら、
別の通りすがりの人が食ってかかっているわけか。
「地図の見方を知ってるのを自慢したいだけ!!」と叫びながら。
0598デフォルトの名無しさん2007/05/16(水) 15:44:27
質問させて下さい

[初めてのPerl 3版]という本を読みながら勉強しているのですが、
3章の練習問題をしていて疑問に思いました。
@list = qw/ a b c d /;
print @list . "\n"; #こうすると、リストの個数が表示される。
print @list; #こうすると、リストの内容が表示される。
print @list , "\n"; #こうすると、リストの内容が表示される。

上記のように、3つの記述ほうほうで内容が変わってきます。
私が疑問に思ったのは、どうして"."で連結すると、リストの個数が
表示されるのでしょうか? また、","が急に出てきたのですが、どう
いった意味があるのでしょうか?

すみませんが、宜しくお願いします。

0599デフォルトの名無しさん2007/05/16(水) 15:51:33
>>565が暴れてます
0600デフォルトの名無しさん2007/05/16(水) 15:59:25
義務ってわけじゃないだろうけど質問スレなんだから質問に答えたくない奴は
スルーすればいいだけなんじゃねーの?
それをわざわざ嫌味ったらしく書き込むから多いから荒れるんだよ。
黙ってろよ。
0601デフォルトの名無しさん2007/05/16(水) 16:15:12
>>598

print @list . "\n";
まず、配列(ここでいう@listね)をprintすると配列の中身をすべて出力するのね。
それで↑は、@listと\nをつなげてひとつの文字列としてる。
配列はスカラ参照するとその要素数を返すから、「配列の要素数+改行」というひとつの文字列として出力される。

print @list;
これは上で言ったとおりそのまま配列の中身をぶちまける。

print @list , "\n";
printは出力対象をカンマで区切って複数指定できるのね。
だから、↑の場合は一つ目の例と違って@listと\nは別物として並列に並んでるのね。
print @list;
print "\n";
と同じというわけ。
だから配列の中身+改行となる。
0602デフォルトの名無しさん2007/05/16(水) 16:18:22
>>600
逆だろ。「RFCを読め」という回答があっという間に返ってきたのに、
それを気に入らなかった奴が騒いでいる。わざわざ嫌味ったらしくね。
黙っていればいいのにね。
06035982007/05/16(水) 16:32:22
>>601
スカラーとして参照されたから、要素数を返したんですね。
詳しく説明していただけたおかげで、理解できたと思います。

ありがとうございました。
0604デフォルトの名無しさん2007/05/16(水) 16:36:58
>>601
部外者だが俺も勉強になった。ありがとう。
0605デフォルトの名無しさん2007/05/16(水) 17:27:58
>>567と>>568が発端になっているわけか。

まあみなさん、不足だと思ったら、攻撃しないで補うということで。
0606デフォルトの名無しさん2007/05/16(水) 19:05:20
ボク今夜寝る時、ママにRFC読んでもらうんだ。
0607デフォルトの名無しさん2007/05/16(水) 19:07:15
フーン
0608デフォルトの名無しさん2007/05/16(水) 19:33:23
⊂二二二( ^ω^)二⊃ フーン
0609デフォルトの名無しさん2007/05/16(水) 19:43:17
まぁ優しい俺が貼ってやるよ
ttp://www5d.biglobe.ne.jp/~stssk/rfcjlist.html
え、みんなこれ全部読んだの??
0610デフォルトの名無しさん2007/05/16(水) 19:48:27
荒らしてるのはいつも質問者
これ、豆知識な
0611デフォルトの名無しさん2007/05/16(水) 19:57:54
そうなの?
0612デフォルトの名無しさん2007/05/16(水) 20:17:47
そういえば質問者のフォロー全然ないな
0613デフォルトの名無しさん2007/05/16(水) 21:26:11
暴れ杉だろう・・・
業務で使うときでも読まないのかだぜ?
0614デフォルトの名無しさん2007/05/16(水) 21:34:58
さらに優しい俺が、>>565が指摘した該当文書を>>609から晒す

http://www.puni.net/~mimori/rfc/rfc2822.txt

次の人:
 上の文章からFromの仕様が書いてある文章を見つけ、行番号等の場所を報告

さらに次の人:
 的確に抜粋して、ここに書く

以上で当スレのミッションは終了となる。
0615デフォルトの名無しさん2007/05/16(水) 21:51:39
そーいや、番号がすぐ出てくるRFCって822(2822)と1149くらいだな、俺。
0616デフォルトの名無しさん2007/05/17(木) 00:28:17
>>565は、rfc2822読むのをやめへんでぇ〜
0617デフォルトの名無しさん2007/05/17(木) 02:12:42
RFC自重
0618デフォルトの名無しさん2007/05/17(木) 04:34:55
CRC556
0619デフォルトの名無しさん2007/05/17(木) 07:08:02
そろそろスレ違いで引っ張るの止めないか?…
RFC 読もうが読ままいが、perl についての質問に該当しなかった訳だし
RTFM ってのは最低限わきまえとく事だし
(ようするに俺も RFC 嫁よって思ってる訳だけど)
0620デフォルトの名無しさん2007/05/17(木) 10:16:00
   . ______________
   | i┬┬┬┬┬┬┬┬┬┬┬┬┬i |
   | |┼ ,r-l^i ‐┼y'⌒~}ー┼y'⌒~}ー┼| |
   | |┼と::_;;;:_}┼じ;_;:;ナ┼ヽ;:;:: :;;:;:;)┼| |
   | |┼┼┼┼┼┼┼┼┼┼┼┼┼| |
   | |┼f_:::_:;;;り┼{:;;;::_;;う┼( ;;:;:;:"")┼| |
   | |┼く:;;;_:;;Jー|ーじ;_;:;ナ┼f_::_::;;;;り┼| |
   | |┼┼┼┼┼┼┼┼┼┼┼┼┼| |
   |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  .|
     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

とりあえず焼肉でも食って落ち着こうぜ
0621デフォルトの名無しさん2007/05/17(木) 10:40:54
>>609
小説を読むわけじゃないんだから、必要なときに必要な箇所を読むんだよ。
0622デフォルトの名無しさん2007/05/17(木) 19:06:20
つうか今回の事でRFCが頭に入ったww
0623デフォルトの名無しさん2007/05/17(木) 20:59:23
パッケージの名前は「foo」のような小文字にするのか、それとも「Foo」のように
大文字で始めるのか、どちらがいいのでしょうか。
perl5.8.8のライブラリを見るとどちらもあるのですが、Perlの流儀だとどのような命名規則がいいのでしょうか。
0624デフォルトの名無しさん2007/05/17(木) 21:24:06
>623
foo みたいに小文字で始まってるのは pragma 扱いだと思う。
0625デフォルトの名無しさん2007/05/17(木) 21:28:28
根拠見っけてきた。

perldoc perlmodlib より
>Package/Module names are an exception to this rule. Perl informally
>reserves lowercase module names for 'pragma' modules like integer
>and strict. Other modules normally begin with a capital letter and
>use mixed case with no underscores (need to be short and portable).
0626デフォルトの名無しさん2007/05/17(木) 23:08:09
pragmaが何かわかりませんが、とりあえず自作のパッケージは大文字で始めるのがいいということでしょうか。
どうもありがとうございます。
0627デフォルトの名無しさん2007/05/18(金) 01:56:34
use strictとかは使ったことあるかお?そーいうことだお
0628デフォルトの名無しさん2007/05/18(金) 02:52:38
pragmaっつーのは端的に言えばインタープリタの動作を変えるもんだ。
よく見かけるのは"strict", "warnings","lib", "overload", "vars", "constant", "blib"あたりかな。
あとは、マルチバイト圏の人が"utf8", "encoding", "open"を使ってたりすることあるな。

P.S
分からないことは恥ではない、分からないことを放置することが恥なのだ
0629デフォルトの名無しさん2007/05/18(金) 03:08:16
baseも仲間に入れてあげてください;;
0630デフォルトの名無しさん2007/05/18(金) 03:14:05
あ、めんごw
baseはOOで継承するときに使うやつな。
よく使うのに、度忘れしてたw
0631デフォルトの名無しさん2007/05/18(金) 20:35:21
有限の整数の集合の中から偶数だけを取りだしてその数を2倍するといった
(1 2 3 4 5 6) -> (4 8 12)
みたいな処理を簡潔にperlで表現したいなら、どのように書くんでしょうか?
0632デフォルトの名無しさん2007/05/18(金) 20:42:42
map { $_ * 2 } grep { $_ % 2 == 0 } (1,2,3,4,5,6)
0633デフォルトの名無しさん2007/05/18(金) 21:20:39
自作のperl script にドラッグ&ドロップして使いたいんですが、
皆さん、どうされてます?
外部補助ツール等を使用しない方法で、perlのみで行いたいんです。
ググッてもうまくヒットしないので…恐縮ですが教えてください。
0634デフォルトの名無しさん2007/05/18(金) 21:22:10
>>633
すいません。WindowsXPでactiveperlの環境です。
0635デフォルトの名無しさん2007/05/18(金) 21:31:03
DropHandlerや{60254CA5-953B-11CF-8C96-00AA00B8708C}でググるといいと思うよ。
0636デフォルトの名無しさん2007/05/18(金) 21:39:21
>>635
OS側の設定だったんですね。助かりました。
0637デフォルトの名無しさん2007/05/19(土) 16:16:37
>>632
mapもgrepもおなじものだが、意味的に条件で抽出のときはgrepを使いたくなるな。

式が偽になったものは返値には残らないので
map { $_ % 2 == 0 && $_ * 2 } ( 1,2,3,4,5,6);
でもOK
0638デフォルトの名無しさん2007/05/19(土) 16:46:07
いや、それだと空文字がたくさん残るだろ。

map { $_ % 2 ? () : $_ * 2 } (1,2,3,4,5,6);
としないと。
0639デフォルトの名無しさん2007/05/19(土) 16:47:21
>638 =~ s/空文字/空文字列/;
0640デフォルトの名無しさん2007/05/20(日) 00:28:19
mapとgrepが同じとな?あなおそろしあ
0641デフォルトの名無しさん2007/05/20(日) 01:38:54
map !($_&1)&&$_<<1||()=> ( 1,2,3,4,5,6)
配列に 0 が入ってたらどうするんだろ
想定外でどうでもいいのかな?
これだと(当たり前だけど)要素の値が 0 の時には戻り値無し。
06426312007/05/20(日) 12:31:03
ありがとうございます。
Lispを勉強して、次はPerlにスイッチしたいと思っていて、なるべくLispスタイルで
プログラミングできるようにしたいと思っているんですが、二つ以上のリストを元にして
結果を返すような
(1 2 3 4 5) (6 7 8 9 10) -> ((1 6) (2 7) (3 8) (4 9) (5 10))
といった処理はどうするのでしょうか?mapの使いかたを見ると使えるのは$_だけみたいなのですが。
0643デフォルトの名無しさん2007/05/20(日) 12:40:10
普通にmapでできるだろ
map {
 $a = $_;
 $b = shift @b;
 処理
} @a
0644デフォルトの名無しさん2007/05/20(日) 12:43:41
どうすれば納得するのか知らんが、
とりあえずリファレンス使わないと、リストのリストとかはできんと思うが。
0645デフォルトの名無しさん2007/05/20(日) 14:06:29
$,=q/,/;$\=qq/\n/;
print @$_ for foo([1 .. 5], [6 .. 10]);
sub foo { map [map shift @$_, @_], (1 .. (sort map scalar @$_, @_)[-1]) }

こんな感じか。
0646デフォルトの名無しさん2007/05/20(日) 14:09:46
sub foo { map [map shift @$_, @_], (1 .. (sort {$b <=> $a} map scalar @$_, @_)[0]) }

間違えた。
0647デフォルトの名無しさん2007/05/20(日) 15:07:14
>>642
っ[List::MoreUtils]
0648デフォルトの名無しさん2007/05/20(日) 15:27:33
ある文字列を一文字単位で全部分解して、配列に格納させたいのですがうまくいきません。
(空白も含みます。)

$text = 'aあ かf漢字';

例えば、上の$textを分解して、

@array = ('a', 'あ', ' ', 'か', 'f', '漢', '字');

のような配列を作りたいのです。

splitを使って
@array = split(/[\w\s]/, $text);
としたのですが、何も格納されずうまく出来ませんでした。
どのようにすれば出来るでしょうか?
0649デフォルトの名無しさん2007/05/20(日) 15:35:50
use encoding cp932; # ソースの文字コードにあわせる
$text = 'aあ かf漢字';
@array = split(//, $text);
06506482007/05/20(日) 15:47:43
>>649
何も指定しないと一文字単位で分解されるんですね。splitは。
その後、
while($text){
 push(@array, substr($text,0,1,''));
}
といったコードを思いついたのですが、
649さんのコードの方がすっきりしてるのでそちらを使わせていただきます。
ありがとうございました。
0651デフォルトの名無しさん2007/05/20(日) 16:32:30
>>650
俺は初心者で、この前俺もそういうコード考えて使ってみてわかったんだが、
substrは1バイト単位で長さ見てるけど日本語は2バイトコード使ってたりしてて、
結局その>>650みたいなコードでひらがなやカタカナや漢字取り出すときにsubstr($text,0,1,'')ってところで2バイト中の1バイトしか取り出せなくて中途半端になるんだよな。
2バイト文字限定なら取り出す長さを2バイトにすれば問題無いし、アルファベットや数字は1バイトで問題無いけど。

>>649のコードなら、俺は大丈夫なのかどうかは知らないけど、なんとなく大丈夫っぽい感じする。
0652デフォルトの名無しさん2007/05/20(日) 16:39:13
>>651
substrのOFFSETやLENGTHの単位は文字数だから、>>650でも
use encodingで文字コードを適切に指定すれば何の問題もないよ。
0653デフォルトの名無しさん2007/05/20(日) 16:59:52
>>652トンクス

参考書見て、substrの説明に「文字数ではなくバイト数で取っていることがわかります。日本語の入った文字では使わないようにしましょう」
ってあったから、substrでは永遠に2バイト文字と1バイト数字アルファベットは同時に処理できないものと思ってました。
use encodingで指定すればsubstrでも2バイト文字部分は長さ1となるんですね。

use encodingでコード指定するのが大切ってことを理解しますた。
0654デフォルトの名無しさん2007/05/20(日) 17:20:46
その機能入ったのはつい最近(といっても5年前だが)だから、古い本だったら書いてないだろうし、
厚みで値段稼いでるような本なら、そのあたりいい加減でも不思議じゃないな。
0655デフォルトの名無しさん2007/05/20(日) 17:45:13
>>654
なるほど、確かに初版第1刷が2003年ってなってる。


初心者質問ですが
my@b=("$a[1]","$a[2]","$a[3]","$a[4]","$a[5]","$a[6]","$a[7]","$a[8]");
↑
こういう書き方をもっと短く書けませんか?
既に@aには$a[0]や$a[9]から先にも変数が入ってる状態で、$a[1]〜$a[8]までを@bに入れたいです。

$a[1〜8]みたいな表現が存在するなら表現方法を教えてほしいです。
0656デフォルトの名無しさん2007/05/20(日) 17:57:06
>655
@a[1..8] で OK。
キーワードはスライス。

ところで、なんで "" で囲ってるの?
0657デフォルトの名無しさん2007/05/20(日) 17:58:21
文字列化する必要があるんじゃね?

my @b = map "$_", @a[1..8];
0658デフォルトの名無しさん2007/05/20(日) 18:14:52
>>656>>657
激しくトンクス!
そういえばfor(0..7)とか使ってました。
@a[1..8]という書き方があったとは。
0659デフォルトの名無しさん2007/05/20(日) 18:23:29
$a   @a
^これや^これの名前ってなんだっけ?
0660デフォルトの名無しさん2007/05/20(日) 18:39:44
普通にドルとアットでいいんじゃない?
なんか$でプレフィクスとか見つけたけど。

@は配列ArrayのAを表し
$は・・・なんだっけ?Sからはじまるなんかの単語じゃなかったっけ?
%は/の左の丸がキーで、/の右の丸が値を示すんだっけ?
なんかそんな感じ。
どうせ声出して読まないし気にするまでも無いような・・・
0661デフォルトの名無しさん2007/05/20(日) 18:45:22
ファニー文字?
0662デフォルトの名無しさん2007/05/20(日) 18:57:19
ああ、思い出した。$はスカラーのS。
0663デフォルトの名無しさん2007/05/20(日) 18:59:10
>>659,660,661
sigil だと思う。
sigilsと複数形にすることも多いが
0664デフォルトの名無しさん2007/05/20(日) 19:10:35
ネットショップなんかで自動監視・購入できるスクリプトが組めるらしいのですが
どういったものなんでしょう。
役に立ちそうなサイトがあったら教えてください。
0665デフォルトの名無しさん2007/05/20(日) 19:44:38
>>663
あーそれそれ。さんくす
0666デフォルトの名無しさん2007/05/20(日) 20:34:14
なんかPerlスゲー人が書く魔法みたいなコードなんか紹介してください
友達が言ってたんですが他の言語だと20行くらいかかりそうな処理も1行で記述できるくらい魔法ちっくなことができるって聞いたんですが本当ですか?
0667デフォルトの名無しさん2007/05/20(日) 20:51:05
本当です
すべてが魔法なので紹介しきれません
0668デフォルトの名無しさん2007/05/20(日) 21:07:49
少なくともCOBOLで20行文の命令を1行にまとめることはできるよ。
0669デフォルトの名無しさん2007/05/20(日) 21:14:04
確かにPerlを使えばどんな複雑な処理でも一行でかけるなw
0670デフォルトの名無しさん2007/05/20(日) 21:31:15
何行で書けるとかPerlたん変態っぷりはそんなことじゃないだろ
0671デフォルトの名無しさん2007/05/20(日) 21:36:44
python見習え
0672デフォルトの名無しさん2007/05/20(日) 21:46:12
>>667-668
もっとやさしく!!

>>669
a + b; b + c; c + d; ... はい1行wwwwwとかは禁止なんです

>>670
もっとやらしく!!
0673デフォルトの名無しさん2007/05/20(日) 22:03:30
>>666
では、とっておきの電卓プログラムを紹介しようか。
C++で書くと、何十ステップも必要だろう。

while(<>){print eval($_)}
0674デフォルトの名無しさん2007/05/20(日) 22:23:07
>>673
カレントディレクトリ以下のファイルがすべて消えました!><
0675デフォルトの名無しさん2007/05/20(日) 22:43:53
>>672
きもい
0676デフォルトの名無しさん2007/05/20(日) 22:50:56
それも計算によって実現してるからな
0677デフォルトの名無しさん2007/05/20(日) 22:55:32
>>674がマジなのか気になる。
>>673をしたらキーボードからどんな文も実行できてしまうよな?
>>674を書いて実行してキーボード触らずにマウスで閉じたら何も起きないよな?

恐怖体験アンビリーバブー
0678デフォルトの名無しさん2007/05/20(日) 22:56:20
ちょっと安価ミスしたが気にしないでくれorz
0679デフォルトの名無しさん2007/05/20(日) 23:18:11
1行で書けるかれしれんが、書く人の労力は20行だよ。
0680デフォルトの名無しさん2007/05/20(日) 23:30:26
でも短く書く技術は知っておきたいかも。
サブルーチンは、多少汚くても短くまとめたいし。
なんか良いサイト無い?
0681デフォルトの名無しさん2007/05/20(日) 23:31:39
結局、正規表現アクロバットきぼんってこと何でしょw
0682クロニクル ◆ob60wHXQlc 2007/05/20(日) 23:32:46
VISTAでACTIVE PERLをインストールしたいんですが、

Build 820 setup
の
CustomsetUP のところでInnstlationErroが出るんです。
初心者なのでわからないことがたくさんあります。
以前XPで何度かインストールしたのですが、VISTAになったとたんできなくて
苦労しております。どうかご教授お願いいたします。

0683デフォルトの名無しさん2007/05/20(日) 23:34:48
>>680
一子相伝も特殊技術だから。
0684デフォルトの名無しさん2007/05/20(日) 23:45:25
正規表現使ってアクロバットするのと、正規表現使わずに少し長いの書くのって、
正規表現使ったほうが早いとかある?
0685デフォルトの名無しさん2007/05/20(日) 23:48:10
そんなの場合によるとしか言いようがないだろ。
0686デフォルトの名無しさん2007/05/20(日) 23:51:35
>>680
このスレの前の方だけでもいくつかあると思うよ。
過去ログ辿ればもっとあるし。
0687デフォルトの名無しさん2007/05/21(月) 00:12:00
結城浩の『Perlクイズ』の過去ログ漁ってみるとか
(結城さんではなく回答者が時々アクロバティック)
0688デフォルトの名無しさん2007/05/21(月) 15:57:04
>>667のコメントだけで、後はスルーすれば良かったのにな
068982007/05/21(月) 16:50:18
CGIを自由に使えるようになりたくて独学で勉強しようとしたのですがCGIはPERL
記述?だからと思いPERLの詳しくなればわかると思いこの板にきました。
PERLに強くなるにはなにを学べばいいですか?ラクダ本というのがいいとどっかで
見たのですが間違いないですか?
そもそもCGIを自由に使えるようになるのはPERLを詳しくなっても意味ないですか?
CGIを自由に扱えるようになりたいので勉強の仕方わかる方お願いします。
0690デフォルトの名無しさん2007/05/21(月) 16:54:26
日本語がお上手ですね!
0691デフォルトの名無しさん2007/05/21(月) 16:57:15
>>1嫁
> CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
> CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
> (WEBプログラミング板 http://pc8.2ch.net/php/ )
0692デフォルトの名無しさん2007/05/21(月) 18:50:54
>>691
向こうでも相手にされていない件についてw
0693デフォルトの名無しさん2007/05/21(月) 19:01:22
>689
かわいそうだからマヂレスしてあげるよ

勉強しなほうが身のため
069482007/05/21(月) 19:01:30
気長に待ちますよ^^
0695デフォルトの名無しさん2007/05/21(月) 19:01:48
相手にできる最低レベルってのはあるからな
■ このスレッドは過去ログ倉庫に格納されています