5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2010/10/22(金) 22:45:29
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://pc11.2ch.net/php/)

このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

http://www.perl.org/get.html
● 2010/07/31 現在の最新版: 5.12.0

▼ 前スレ
Perlについての質問箱 44箱目
http://hibari.2ch.net/test/read.cgi/tech/1280541200/
リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-7 あたり

841 :デフォルトの名無しさん:2011/02/05(土) 01:08:00
perlは先頭行に #user/bin/perl なコメントのソースファイル
を当たり前のように見るけど、意味不明だ。


842 :デフォルトの名無しさん:2011/02/05(土) 01:13:31
それは誰でもイミフだろうと思うがshebangでぐぐるといいよ

843 :デフォルトの名無しさん:2011/02/05(土) 06:31:28
userは見たことないな、今のところ

844 :デフォルトの名無しさん:2011/02/05(土) 06:42:36
文字列が数値に変換されるとき、前方の 0 は無視されると解釈してよろしいのでしょうか?

my $x = "012";
print $x + 0; # => 12

845 :デフォルトの名無しさん:2011/02/05(土) 06:45:22
その認識でok
文字列をちゃんと数値として解釈してほしいのであれば、oct関数を使うといいよ。


846 :デフォルトの名無しさん:2011/02/05(土) 07:45:05
>>845
d
oct関数っていうのもあるんですね。

でも、oct関数を使うと、なぜか10になっちゃいます><

my $x = "012";
print oct($x); # => 10

847 :デフォルトの名無しさん:2011/02/05(土) 07:57:24
>>843
間違えたuserではなくusrで、#の次に!が抜けてた

848 :デフォルトの名無しさん:2011/02/05(土) 08:06:59
つ8進法

849 :デフォルトの名無しさん:2011/02/05(土) 08:29:09
要するに、windowsでは不要なんだな。
シバンというヘッダーを全く付けずに作ってたが、unixではないから
やはり正解だったんだな。
個人宅や職場でunixやlinuxなんか見ることないのに、コンピュータ技術
の分野ではwindowsを上回ってるかも知れないくらいに、コンピュータの
プロの人は仕事で利用してるんだな。

850 :デフォルトの名無しさん:2011/02/05(土) 08:57:28
active perlで起動させたたコマンドウインドウを、タスクトレイにしまう方法ってありますか?
ずっと動かし続けるのに邪魔なので。

851 :デフォルトの名無しさん:2011/02/05(土) 09:29:44
wperlというのがそれな筈なんだけど、うまくいかない

852 :デフォルトの名無しさん:2011/02/05(土) 09:54:23
wperlは確認用のウインドウすら出なそうなので
別のソフトで探したところTaskTrayPlusを使って出来ました

TaskTrayPlus
「ホットキーの設定に失敗しました!」って出るけどうまくいった
ttp://bnassoft.s35.xrea.com/

DM2
使い勝手いいけどPerlだけ無反応
ttp://dm2.sourceforge.net/

853 :デフォルトの名無しさん:2011/02/05(土) 11:07:10
#の次に!だけでなく、usrの前に/も抜けてた

854 :デフォルトの名無しさん:2011/02/05(土) 11:41:47
いいよお前以外分かってるから

855 :デフォルトの名無しさん:2011/02/05(土) 16:36:19
http://ideone.com/D9Nqc
CGI.pmで複数のcssファイル(index.cssとbase.css)を適用させようとして上記URLにあるコードを
書いたのですが、うまく二つとも適用されません。
どのようにすれば二つのCSSファイルを適用させることが出来ますか?

856 :デフォルトの名無しさん:2011/02/05(土) 16:40:26
ttp://perl.wonder-boys.net/?p=210

857 :855:2011/02/05(土) 16:46:45
>>856
そこを見て下記のようなコードを書くなどして上手くいかなかった為、今回質問しました。
http://ideone.com/FJr73
http://ideone.com/7YfA4

858 :デフォルトの名無しさん:2011/02/05(土) 16:59:03
use CGI;

use CGI qw/:standard/;

859 :855:2011/02/05(土) 17:26:28
できました!なるほどー
ありがとうございます!

860 :Perl評論家:2011/02/05(土) 21:15:18
WindowsでPerlやってる人いますか?
MacやLinuxと違って注意するところはなんですか?

CPANとか文字コードですか?教えて下さい

861 :デフォルトの名無しさん:2011/02/06(日) 00:09:45
Macにもperlがあったか

862 :Perl評論家:2011/02/06(日) 00:41:53
Macにもあんだけどさあ
なあ、前に
->矢印演算子がちょっとわからなかったからさあ


(矢印演算子)

C や C++ と同じように "->" は中置の被参照演算子です。
右側が [...], {...}, (...) のいずれかの形の添字であれば、左側は配列、ハッシュ、 サブルーチンへのハードリファレンスかシンボリックリファレンス
(あるいは 技術的には、配列またはハードリファレンスが代入可能であれば ハードリファレンスを保持できる場所) でなければなりません。perlreftut と
perlref を参照してください。

そうでなければ、右側はメソッド名かサブルーチンのリファレンスを持った 単純スカラ変数で、左側はオブジェクト
(bless されたリファレンス) か クラス名でなければなりません。 perlobj を参照してください。


って言われたから
perldoc.jp読む癖つけたわ
まじperldocってさいこうなんだけど

>右側はサブルーチンのリファレンスを持った 単純スカラ変数

これってさあ $sub=sub{'bakasinekiero'};

$obj->$subってことだろお?
もうまじリファレンスもマスターしちゃったからさあ

おれはPerlマスターなんじゃないかなあ

863 :Perl評論家:2011/02/06(日) 01:03:42
初めてのPerlだけでだいたいわかるよ
あとはperldoc

これだけオブジェクトPerlなんてかわなくていい

864 :デフォルトの名無しさん:2011/02/06(日) 01:07:30
でも、Effective Perlは買おう

865 :デフォルトの名無しさん:2011/02/06(日) 08:11:49
Effective Perlは第2版が出そうだから今は我慢してる

866 :デフォルトの名無しさん:2011/02/06(日) 11:16:24
エキスパートCプログラミングのperl版みたいな本はないのかな

867 :デフォルトの名無しさん:2011/02/06(日) 11:45:51
perlってサーバー上じゃないと動かないよね?C++やjavaに比べたら重いし遅いし不便だよね。

868 :デフォルトの名無しさん:2011/02/06(日) 12:03:24
>>867
なんという釣り針

869 :デフォルトの名無しさん:2011/02/06(日) 12:11:14
perl の歴史を無視とかw

870 :デフォルトの名無しさん:2011/02/06(日) 12:14:48
>>867
お前PerlをPHPみたいなWEBでしか動かない言語と思ってないか?

871 :デフォルトの名無しさん:2011/02/06(日) 12:29:13
.NETってきくだけでうさんくさい

872 :デフォルトの名無しさん:2011/02/06(日) 13:56:08
perl.net

873 :Perl忍者 ◆M5ZWRnXOj6 :2011/02/06(日) 18:43:15

869 :デフォルトの名無しさん:2011/02/06(日) 12:11:14
perl の歴史を無視とかw



爆笑

874 :デフォルトの名無しさん:2011/02/06(日) 19:06:09
技術の最先端を追うには英語読めないとやってられないの?

875 :デフォルトの名無しさん:2011/02/06(日) 21:12:32
DBIで$sth(ステイトメントハンドラ)からfinish()とすると
Useless use of private variable in void context at test1.pl line 10.
といわれるんですけど、これってやる必要ないのでしょうか?

use strict;
use warnings;
use DBI;
my $dbh = DBI->connect('dbi:odbc:test_dsn', 'test', 'test1');
my $sth = $dbh->prepare("SELECT * FROM TEST1");
$sth->execute();
while (my ($a,$b)=$sth->fetchrow_array) {
print "a=$a, b=$b\n";
}
$sth=>finish();
$dbh->disconnect();

こんな感じのコードです。perl -vはv5.10.1です。


876 :デフォルトの名無しさん:2011/02/06(日) 21:15:35


877 :デフォルトの名無しさん:2011/02/06(日) 22:59:02
× $sth=>finish();
○ $sth->finish();

=> であるか -> でないか

878 :デフォルトの名無しさん:2011/02/06(日) 23:28:00
そういう意味だったですね。。。
すいませんでした。

879 :Perl忍者 ◆M5ZWRnXOj6 :2011/02/07(月) 00:47:05
究極オブゴットオブバカス

880 :Perl忍者 ◆M5ZWRnXOj6 :2011/02/07(月) 01:01:42
俺ってこんなクソコテだけどPerl(2ch)スレでは高レベル

881 : ̄ ̄ ̄ ̄)ノ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄:2011/02/07(月) 04:28:00
     ∧_∧
    ( ´・ω・`)     ∧_∧
    /     \   (     ) そうきたかwww
.__| |    .| |_ /      ヽ
||\  ̄ ̄ ̄ ̄   / ..|   | |
||\..∧_∧    (⌒\|__./ ./
||.  (    .)     ~\_____ノ|   ∧_∧
  /   ヽ.ワロス       \|   (    ) お前が言うと説得力あるなあww
  |     ヽ           \/     ヽ.
  |    |ヽ、二⌒)        / .|   | |
  .|    ヽ \∧_∧    (⌒\|_ .../ /


882 :デフォルトの名無しさん:2011/02/07(月) 21:18:43
utf8で
@file=('ファイル名 #テクスト(abc).d2v', 'ファイル名 #テクスト(abc).ts', 'ファイル名 #テクスト(abc) PID 110 DELAY -3ms.aac');
$filename=ファイル名 #テクスト(abc);
が入力されていて
ファイル名 #テクスト(abc) PID 110 DELAY -3ms.aac
を取得するために
foreach $j(@files){
print NEW "rem ".$j."\n";
if($j=~/$aacfilename.+aac$/){
}
}
としたのですが、取得できませんでした。

$filename=ファイル名 #テクストabc;
@file=('ファイル名 #テクストabc.d2v', 'ファイル名 #テクストabc.ts', 'ファイル名 #テクストabc PID 110 DELAY -3ms.aac');
であれば、
ファイル名 #テクストabc PID 110 DELAY -3ms.aac
をマッチさせることができました。
文字列に()が含まれている時でもマッチさせるにはどうすればよいでしょうか?

883 :デフォルトの名無しさん:2011/02/07(月) 22:08:33
初めてperlが仕事で役に立ったよ

884 :デフォルトの名無しさん:2011/02/08(火) 02:19:16
>>882
/\.aac$/

885 :デフォルトの名無しさん:2011/02/08(火) 09:57:24
>>882
$j =~ s/([()])/\\$1/g;

886 :デフォルトの名無しさん:2011/02/08(火) 15:49:32
perlってなんで、こう謎な圧力うけること多いの?
http://www.yabbforum.com/community/YaBB.pl?num=1286567562
今日もlispスレでperl糞とか言われてしまったわ

887 :Perl評論家:2011/02/08(火) 17:21:51
http://www.yabbforum.com/community/YaBB.pl?num=1286567562

ここで
shitっていれてもでてきませんでした

糞ってどこに書いて案ですか?

888 :Perl評論家:2011/02/08(火) 17:41:01
lispスレでしたすみません

889 :デフォルトの名無しさん:2011/02/08(火) 21:04:08
>>884,885
回答ありがとうございます。
そして、言葉足らずですみません。
$filenameに格納された文字列でマッチをさせたいのですが
どのようにすればよいでしょうか?

890 :882,889:2011/02/08(火) 21:08:15
>>884,885
度々すみません。
$filenameに格納された文字列を含んで、aacも含む
条件でマッチさせたいです。
その時はどのようにすればよいでしょうか?

891 :デフォルトの名無しさん:2011/02/08(火) 21:12:49
&&

892 :デフォルトの名無しさん:2011/02/08(火) 21:13:05
$filename = "\Qfilename";

893 :882,889:2011/02/08(火) 21:23:58
>>891,892
回答ありがとうございます。
if($j=~/\Q$aacfilename\E.+aac$/){
で期待通りの結果になりました。
これでファイル処理が楽になります
ありがとうございました。

894 :Perl忍者 ◆M5ZWRnXOj6 :2011/02/08(火) 23:48:32
うぜえ

正規表現ぐらいで質問してるやつ

895 :デフォルトの名無しさん:2011/02/08(火) 23:52:08
今度OSをXPからwindows7に変えそうなのですが、win7でもactiveperlをインストさえしてしまえば、これまで書いた大抵のコードはXPのときと変わらず使えるでしょうか?
ファイルの読み書き、コマンドプロンプトに文字を表示、文字列の操作や数値の計算などの簡単なものです
あとはCPANでのモジュールのインストールなどです
やり方を一新しないとモジュールのインストができない、とかはないですよね?
以前やってた時はコマンドプロンプトで
perl -MCPAN -e shell
install (モジュール名)
のようにやってました

896 :デフォルトの名無しさん:2011/02/08(火) 23:57:04
nmakeっていうやついれたほうがいいらしいぜ

おれさあ

Windows買ってからさあ

CPANとかで導入するときエラー出てやる気うせるんだよね^^;

だからWindowsでPerlやるのめんどくさいんだよね

ichatのBOTつくろうとしたら
モジュール入れるとき Linuxみたいに入らなくてやる気うせたんだよね^^;

windows764bitだとnmake意味不明だったから^^;

897 :デフォルトの名無しさん:2011/02/09(水) 00:50:26
>>896
ありがとうです。
CPANのやり方は64bitだとかなりめんどそうですね、調べてもあまり載ってないし・・・
前にXPでやったときは下のサイトをそのままやっちゃったんですよね
だからあんまり身についてなくて(´д`;)
ttp://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2F%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB(CPAN)

nmakeってのはVisual Studio Express Editionsに入ってるみたいだから、win7でもtarとgzip入手して、Visual Studio Express Editionsインストしたら出来るのかな・・・

898 :デフォルトの名無しさん:2011/02/09(水) 07:53:16
Strawberry Perlはどうなの?

899 :デフォルトの名無しさん:2011/02/09(水) 17:19:24
達人の方知恵をください。

引数の内容や数でサブルーチンの処理を動的に変えたいです。
例えば引数の和を返す場合に処理の部分をスマートに書く方法はありますか?

add($a);
add($a, $b);
add(@c);
add(\@d, \@e);

sub add
{
処理;
return $ans;
}

900 :デフォルトの名無しさん:2011/02/09(水) 17:44:47
3つ目の配列にぶち込んだ方が楽っちゃ楽よね

リファレンスはめんどくさいので考慮しないとしてw、


sub add{

my @data = @_;
my $total = 0;
foreach my $datum (@data){
$total += $datum;
}

return $total;

}




なんも考えずにざっと組むと、こんな感じ。

901 :デフォルトの名無しさん:2011/02/09(水) 17:52:38
sub add {
my$sum = 0;
$sum += ref $_ eq "ARRAY" ? add(@$_) : $_ foreach @_;
return $sum;
}

902 :899:2011/02/09(水) 17:58:03
例として和を出したのですが、目的は足す処理ではなく
「引数の内容で処理を変えたい」です。

サブルーチンのプロトタイプ宣言が複数できれば簡単なのですが、perlでは無理みたいです。
sub add(\$)
sub add(\$\$)
sub add(\@)

やはり引数に応じてサブルーチンを複数作るのがベストプラクティスなのでしょうか?

903 :899:2011/02/09(水) 18:10:54
>>901
型をチェックして処理を分けるイメージですね

引数のパターンをいかにチェックするかがキーなのか・・・
ありがとうございます、方向性が見えてきました。

904 :デフォルトの名無しさん:2011/02/09(水) 19:20:12
>>899
use List::Util qw(reduce);

sub my_flatten { return map{ ref $_ eq 'ARRAY' ? my_flatten(@{$_}) : $_ } @_ }

sub add {
no warnings 'once';
return reduce{ $a+$b } my_flatten(@_);
}

905 :デフォルトの名無しさん:2011/02/09(水) 22:46:17
Strawberry Perl良いんだけどactive scriptで動かないから結局AcrivePerl入れてしまう

906 :デフォルトの名無しさん:2011/02/10(木) 00:14:01
ぐぐったけどわからなかったです
perl初心者です
mac です
hello worldまで、実現したいです
macは、はじめから、perlをはいっているとしりました
どこにありますか?
すいません



907 :デフォルトの名無しさん:2011/02/10(木) 00:19:06
906です
システムにありました
次は、helloworldをかきたいです
何のファイルを、使えばよいでしょう?
たびたびすいません

908 :デフォルトの名無しさん:2011/02/10(木) 00:49:36
>>903
規模にもよるけど、引数のセット毎に別のクラス作って実装するかな。

909 :デフォルトの名無しさん:2011/02/10(木) 01:31:50
macってターミナルとかコマンドラインとかいわれてるやつあったっけ
そこからperl -e "print qq/hello the world./;"とでもうちこんでみればどうか

910 :デフォルトの名無しさん:2011/02/10(木) 02:36:54
こういうことをやりたかったのだろうか。

use Class::Multimethods;
...
multimethod add => ('$', '$') => sub { ... };
multimethod add => ('ARRAY') => sub { ... };
multimethod add => ('$', 'ARRAY') => sub { ... };

911 :デフォルトの名無しさん:2011/02/10(木) 04:33:52
条件演算子 ?= を使おうとしていますが、場合により結果が異なるのはどうしてでしょうか?

my ($x, $y, @array);
for (0 .. 1) {
$array[$_] = $_;
$array[$_] ? ($x = 1) : ($x = 0);#期待通りの結果
$array[$_] ? $y = 1 : $y = 0; #期待と異なる結果
print "array = $array[$_], x = $x, y = $y\n";
}

結果
array = 0, x = 0, y = 0
array = 1, x = 1, y = 0

912 :デフォルトの名無しさん:2011/02/10(木) 04:53:45
perlop > Conditional Operator

913 :デフォルトの名無しさん:2011/02/10(木) 07:38:04
>>911
$array[$_] ? $y = 1 : $y = 0;
だと、
($array[$_] ? $y = 1 : $y) = 0;
のようになっている気がする。
$array[$_] ? ($y = 1) : ($y = 0);
ておけば大丈夫…だが、そもそも
$y = $array[$_] ? 1 : 0;
と書けばなんてことはない。


914 :デフォルトの名無しさん:2011/02/10(木) 08:49:45
>909 できた!
thx!

god bless you ,909




915 :デフォルトの名無しさん:2011/02/10(木) 12:08:05
emacsでperlのコードを部分選択して
C-c C-r
で選択したところだけ評価したいのですが
.emacsにいろいろ設定しないとだめなのでしょうか
デフォルトでperl-modeやcperl-modeってのが入ってるみたいですが
そのままでは上記のことができません

916 :デフォルトの名無しさん:2011/02/10(木) 12:47:24
>>912>>913
ありがとうございます。

>そもそも
>$y = $array[$_] ? 1 : 0;
>と書けばなんてことはない。
その通りなのですが、
実際は $array[$_] ? ($x = 1) : ($y = 0); のような処理なのです。

917 :デフォルトの名無しさん:2011/02/10(木) 13:21:13
ワケワカランAAry

918 :デフォルトの名無しさん:2011/02/10(木) 13:40:56
if使って書き直したいところだな

919 :デフォルトの名無しさん:2011/02/10(木) 14:11:11
('b','c','a')をソートして、('a','b','c')と添字の順序(2,0,1)を得たいのですが、良い方法はありますか?
組込み巻数にはなく、サブルーチン自作でしょうか?


920 :デフォルトの名無しさん:2011/02/10(木) 14:27:40
$i=0;
map {$_->[1]}
sort {$a->[0] cmp $b->[0]}
map {[$_, $i++]}
@list;

921 :デフォルトの名無しさん:2011/02/10(木) 14:50:35
>>916
値を使う訳じゃないならわざわざ三項演算子で見づらくしなくても
if文でいいんじゃないかという素朴な疑問


922 :919:2011/02/10(木) 16:38:31
>>920
ありがとうございます
うまくできました

923 :デフォルトの名無しさん:2011/02/10(木) 16:40:58
遅かったか。

>>919
my @array = qw( b c a );
my @order = sort { $array[$a] cmp $array[$b] } 0..$#array; # 2,0,1
my @sorted = @array[@order]; # qw( a b c )
my %sorted = map +($array[$_] => $_), @order; # (a=>2, b=>0, c=>1)

924 :919:2011/02/10(木) 18:42:12
>>923
ありがとうございます
こちらも保存しました 

925 :gfx:2011/02/10(木) 19:23:16
>>>919
$i=if->aaa[100];
map printf "$i+++";
@list print;
$aa=qw/ /=qw/aaza/aa/a/a/aa/;

926 :gfx:2011/02/10(木) 20:46:35
僕の株価がどんどんあがってますねw

927 :gfx:2011/02/10(木) 20:54:24
みんな gfx++ してくださいねw

928 :デフォルトの名無しさん:2011/02/10(木) 22:36:30
gfy

929 :デフォルトの名無しさん:2011/02/11(金) 09:06:37
私は今まで、「\r=\x0D、\n=\x0A」と思っていたのですが、下記サイト↓に、
「Perlという言語の中で論理的に定義された復帰文字と改行文字です」
と書かれています。

Perlメモ
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify

Windowsの場合、\n(=\x0A)はPerlIOを通過する時に(:crlfレイヤがあれば)\x0D-\x0A
に変換されると認識しておりました(入力の場合はその逆の変換)。

ただ、上記サイトの表に、Macの場合、

binmode FH;
print FH "\n"; # => \x0D を出力

と書かれています。
今のMacはUNIXベースなので、多分、改行は\x0Aだと思いますが、昔のMacは本当に
binmodeした時でも、\x0Dを出力していたのでしょうか?

もし、そうならば上記サイトで指摘されているように、「\r=\x0D、\n=\x0A」という
私の認識は間違いのような気がします。

930 :デフォルトの名無しさん:2011/02/11(金) 09:42:13
>>929
http://perldoc.perl.org/perlport.html#Newlines
気になるなら自分で環境を手に入れて確認してくれ。

931 :デフォルトの名無しさん:2011/02/11(金) 10:09:48
>>930
ありがとうございます。

「\nは論理的な改行を表す」と書いてありますね。
1つ賢くなりました。

>Perl uses \n to represent the "logical" newline, where what is logical may
>depend on the platform in use. In MacPerl, \n always means \015 .
>In DOSish perls, \n usually means \012

932 :http://blog.oricon.co.jp/benjo/:2011/02/11(金) 10:26:54
rand 2 と rand * 2 はまったく同じですか?

933 :デフォルトの名無しさん:2011/02/11(金) 10:51:27
違います

細かい小数点は省くけど

rand(2) → 0 〜 1.99
rand() * 2 → (0 〜 0.99) * 2 = 0 〜 1.98 (ただし得られるのは2の倍数のみ)

となります


934 :デフォルトの名無しさん:2011/02/11(金) 11:09:40
>>933
その解釈も違うと思う。

>perl -we "print rand * 2"
Argument "*main::2" isn't numeric in rand at -e line 1.
0.849334716796875
>perl -we "$foo = 100; print rand $ foo"
79.45556640625
>perl -we "print rand 0"
0.341094970703125

Perl はプレフィクスとトークンの間にホワイトスペースが入ってもいいんだ。

935 :デフォルトの名無しさん:2011/02/11(金) 11:48:40
内部的には同じことをしているのでは

936 :デフォルトの名無しさん:2011/02/11(金) 14:09:11
>>934
最初のやつ、「2」が数値扱いされて
ないだろ?
「*2」としてrandの引数になってる。


937 :デフォルトの名無しさん:2011/02/11(金) 17:31:50
% perl -E'srand(1);say rand(2); srand(1); say rand() * 2'

938 :デフォルトの名無しさん:2011/02/12(土) 02:11:03
Mechanizeを使ったcgiに関する質問は、このスレでよろしいでしょうか?

939 :デフォルトの名無しさん:2011/02/12(土) 03:37:15
Mechanize はもう飽きたなぁw

940 :Perl忍者 ◆M5ZWRnXOj6 :2011/02/12(土) 09:07:09
Mechanizeの質問してるキチガイってこいつじゃないw
http://lhlhlh.blog71.fc2.com/blog-entry-117.html
「広い意味でコンピュータ関係のブログ」

前にスクリーンショットのこと聞いてたし


>perlでウェブページのスクリーンショット保存アップロードし一覧にしてhtml出力

941 :デフォルトの名無しさん:2011/02/12(土) 11:46:13
プライベートメソッドのとき無名関数を使うんですが

後にかかないと エラーでちゃいます

無名関数はプロトタイプ宣言できないのでしょうか?

package car;
sub new{
my $self=shift;
return bless({},$self);
}
my $punk=sub{
my $self=shift;
print "punk!";
};
sub boo{
my $self=shift;
print "booo!";
$self->$punk;
}

$punkを後に書くとエラーでます
やはり前に書くしかないのでしょうか?



942 :デフォルトの名無しさん:2011/02/12(土) 11:53:56
サブルーチンの場合は

sub aa;みたいに

やっぱり 無名関数は変数としてみるから前に書かないといけないんですか?

教えてください

943 :Perl忍者 ◆M5ZWRnXOj6 :2011/02/12(土) 11:57:41
変数ってなにかわかりますか?^^;
レキシカル変数に無名サブルーチン代入してるじゃないですか 変数ですよこれ
newの下か上に宣言しろよw そうすればその下のメソッドで利用可能になるから
なのでsub $punk;なんてできません

そのぐらいわかれよカス

944 :デフォルトの名無しさん:2011/02/12(土) 14:28:13
>>941
質問内容と具体例が乖離してるぞ。
サブルーチンリファレンスにて
「プロトタイプ宣言出来るか?」
「プロトタイプの先行宣言出来るか?」
って質問なら、
前者は出来ない(宣言したつもりでも無視される)し、
後者も出来ない(シンタックスエラーになるか、したつもりになるだけ)。

==============
#!/usr/bin/env perl
use strict ;
use warnings ;

my $sub = sub ($) {} ; # 先行宣言したつもり
$sub->( q{hoge}, q{foo} );
$sub = sub ($) { printf "%s %s\n", @_ } ; # プロトタイプ宣言したつもり
$sub->( q{hoge}, q{foo} );

{
sub new { bless {}, shift }
my $foo ; # 先行宣言したつもり
sub echo{ shift->$foo }
$foo = sub{ printf "%s\n", shift } ;
}
main->new->echo ; # <= 先行宣言の検証にはなりえない。
==============


945 :デフォルトの名無しさん:2011/02/12(土) 16:46:01
作りにくい設計は良くない設計

946 :デフォルトの名無しさん:2011/02/12(土) 18:31:58
出力ファイルが既にあった時に、_1を付けて別の名前を付けるけど、
_1が付いたのも既にあったら_2を付ける的に順次増やしていく方法で
ファイル名を決定するスマートなやり方は?

947 :Perl評論家:2011/02/12(土) 18:47:17
まっちんぐさせて 数値をインクリメント

948 :デフォルトの名無しさん:2011/02/12(土) 18:47:49
>>946
命名規則の話?
ファイル検索ロジックの話?
「_1」を「_2」に置換するコードの話?

949 :デフォルトの名無しさん:2011/02/12(土) 19:11:07
>>946
ループにして最初に存在しなかったファイル名で決定すりゃいいだけでしょ?
for(0..99){
 my $fn = "hoge" . ($_ ? "_$_" : "");
 if(-e $fn) {
  print "${fn}は存在した\n";
 }else{
  print "${fn}は存在しなかったので決定\n";
  last;
 }
}

ちなみにlogrotateとは動き違うよ

950 :Perl評論家:2011/02/12(土) 19:18:01
俺のまねスンナ

951 :デフォルトの名無しさん:2011/02/12(土) 19:28:32
Mechanizeの利用でつまづいています。
利用している無料サーーバーはPerlに対応しているのですが、
Mechanizeに対応しているかは分かりません。

Mechanizeのインストール方法は、下記のQ&Aの通りでいいのでしょうか?
http://oshiete.goo.ne.jp/qa/1680065.html
実際にやってみたのですが、cgiページを表示しても500エラーになります。
アップするフォルダや、cgiに書くフォルダ位置などを色々変えて試しましたが、
やはり動きません。

Mechanizeが使えるサーバーであるどうか、チェックする方法や、
初心者向けのインストール方法などが解説されたサイトはないでしょうか?

952 :デフォルトの名無しさん:2011/02/12(土) 19:34:58
なるほど
三項演算子がうまく使えるな

953 :デフォルトの名無しさん:2011/02/12(土) 19:43:42
>>949
決定したときには存在しなかったファイルが、作成するときには
すでに存在する。 そういう場合がある。

954 :デフォルトの名無しさん:2011/02/12(土) 20:04:27
ロックぐらいするだろjk

955 :デフォルトの名無しさん:2011/02/12(土) 20:13:51
決定したときには存在しなかったファイルが、ロックするときには
すでに存在する。 そういう場合がある。

956 :デフォルトの名無しさん:2011/02/12(土) 20:16:15
ファイル名を決定する手続きを排他ロックする

って書けばよろしいでしょうか(笑

957 :デフォルトの名無しさん:2011/02/12(土) 20:30:05
その方法も教えてくれればベター。

958 :デフォルトの名無しさん:2011/02/12(土) 20:30:59
マルチコアのCPUだとそれでも失敗したり

959 :デフォルトの名無しさん:2011/02/12(土) 23:28:54
ファイルハンドルを返した方が早そうだから、そうしてみた。
しかし、エロ画像に連番を振りなおす程度なら、ここまで仰々しいものは要らない。

use Fcntl qw(:DEFAULT :flock);
use Errno;

sub create_new_file {
my ($name, $ext) = @_;
my $file = "${name}.${ext}";
my $number = 1;

return sub {
while(1){
unless(-e $file){
if (sysopen(my $fh, $file, O_WRONLY|O_CREAT|O_EXCL)){
flock($fh, LOCK_EX);
return $fh;
}
($! == Errno::EEXIST) or last;
}
$file = "${name}_${number}.${ext}";
$number++;
}
die "cannot create file $!";
};
}

my $create = create_new_file("foo", "txt");
my $fh = $create->();
...

960 :デフォルトの名無しさん:2011/02/12(土) 23:36:47
元の「スマートなやり方」からかなり遠くまで来てしまった

961 :デフォルトの名無しさん:2011/02/12(土) 23:47:25
#use Exporter;
#our @ISA = qw/Exporter/;
#our @EXPORT = qw//;

みたいにコメントアウトしても使えてるんだけど、これはこれで大丈夫なの?

962 :Perl評論家:2011/02/13(日) 00:07:49

作品のよさ>>>>>>>スマートとかコード美学>>>perl5の書き方 (笑)

963 :デフォルトの名無しさん:2011/02/13(日) 00:14:02
>>959
O_EXCLしてるんだから、-eで調べなくてもいいんじゃねーの?
-eとopenの間に他のプロセスに割り込まれる可能性を排除
できないから-eあんま意味ないと思う。

964 :デフォルトの名無しさん:2011/02/13(日) 00:44:10
今の設定を読み込む→変数の中身を変える→書き直す
これの一連の作業を%PLAYER_LISTの全員に対して行いたくて下記のようにしているのですが、
これだとforeachで%PLAYER_LISTを2度回して(?)いてループを無駄にしていると思います。
ループを一度で終わらせる方法はないのでしょうか?

foreach $id (keys %PLAYER_LIST){
&Ps_CONVERT($id);
$PL_p[$qn]=0;
open(PUSHLOG,">../$DBF/$nend/$DB_P");
flock(PUSHLOG, 2);
print PUSHLOG "\%PLAYER_LIST=(\n";
foreach $key (sort {$a<=>$b} keys %PLAYER_LIST){
if($key ne $_[0]){
print PUSHLOG "\'$key\'=>\'$PLAYER_LIST{$key}\',\n";
}
}
print PUSHLOG "\"$_[0]\"=>\'@PL_p\',\n";
print PUSHLOG ");\n1;\n";
close(PUSHLOG);
}

965 :デフォルトの名無しさん:2011/02/13(日) 00:53:05
ファイルを開く前にロック出来れば問題解決出来るのになぁ。。。

966 :956:2011/02/13(日) 00:55:48
>>963
Windowsでは、同名のディレクトリがあるとEACCESを返すため。その対処。

967 :959:2011/02/13(日) 00:57:49
>>966=>>959
名前を間違えた。

968 :デフォルトの名無しさん:2011/02/13(日) 08:58:46
>>966
-eとopenの間にディレクトリ作られたらだめなので、EACCESが
返ったらディレクトリがあるかチェックしてエラーにするか次の
番号に進むか分岐するようなロジックにしないといかんのでは?


969 :デフォルトの名無しさん:2011/02/13(日) 09:25:44
>>4のテンプレート案なんですが、これ↓って

use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)"; # ※1

まとめて、こう↓するのは、省略しすぎてわかりにくい?

use open qw/:encoding(cp932) :std/;

970 :デフォルトの名無しさん:2011/02/13(日) 09:59:14
>>959
エロ画像に連番を振りなおす上に重要な仕事などない。

971 :デフォルトの名無しさん:2011/02/13(日) 11:49:22
下記は12.plの中身です。下記を実行させると、
Can't locate object method "speak" via package "Mouse" at 12.pl line 13.
が表示される。
具体的にどこが悪いのだろうか。SUPERが関係はしていると思いますが
分かりません。済みません。教えてください。

1 { package Animal;
2 sub speak {
3 my $class = shift;
4 print "a $class goes ", $class->sound, "!\n"
5 }
6 }
7 # same Animal as before
8 { package Mouse;
9 # same @ISA, &sound as before
10 sub sound { "squeak" }
11 sub speak {
12 my $class = shift;
13 $class->SUPER::speak;
14 print "[but you can barely hear it!]\n";
15 }
16 }

Mouse->speak;



972 :デフォルトの名無しさん:2011/02/13(日) 12:42:15
>>971
Mouse の親クラスを @Mouse::ISA に指定していない

http://perldoc.jp/pod/perlboot#The20SUPER20way20of20doing20things
> SUPER クラスに変えることで 検索を自動的に全ての基底クラス群
> (@ISA に記述されているクラス群) に対して行うことができます。

973 :デフォルトの名無しさん:2011/02/13(日) 14:35:23
971さんへ、動きました。有難うございました。助かりました。


974 :デフォルトの名無しさん:2011/02/13(日) 14:36:19
972さんへ、動きました。有難うございました。助かりました。


975 :デフォルトの名無しさん:2011/02/13(日) 15:26:48
>>972のページを見てて思い出したのですが、今はuse baseでなくuse parentを
使いましょうということらしい。

使っちゃいけない標準モジュール - JPerl advent calendar 2010 casual Track
http://perl-users.jp/articles/advent-calendar/2010/casual/23

976 :デフォルトの名無しさん:2011/02/13(日) 23:37:04
>>968
-eとopenの間にディレクトリが作られたら何が駄目なの?
そういう場合はdieするだけじゃだめなの?

>>970
そんな仕事があるのか。世の中は広い…。

977 :デフォルトの名無しさん:2011/02/13(日) 23:45:22
自分ではコード書かずに、ほんと、口ばっかりの奴でうんざりする。
ちょっとアレだったけど、ちゃんと回答してたperl忍者がマシに見えるわ。

978 :デフォルトの名無しさん:2011/02/14(月) 02:25:55
ある変数$yを使って、$yに収納されている文字列を配列@wordsの中から探し出して取得した際に
取得した文字列があったところのインデックスを取得したいのですが、やり方を教えていだたけないでしょうか。

979 :デフォルトの名無しさん:2011/02/14(月) 02:52:45
>>978
http://perldoc.perl.org/perlfaq4.html#How-do-I-find-the-first-array-element-for-which-a-condition-is-true%3F

980 :デフォルトの名無しさん:2011/02/14(月) 07:01:14
>>976
dieするんじゃなくて次の番号に行って欲しいと思うんだけどなぁ。
レアケースなのであきらめるというのもそれはそれでありだけど。
968のようにしたとしてもopenの直後にディレクトリを消されたら
同じような問題があって、結局アトミックに判定できない以上は
どこまで頑張るかの程度の違いでしかない。EACCESSを返すwindows
が一番悪いような気はするw



981 :デフォルトの名無しさん:2011/02/14(月) 08:30:55
>>980を超えるとdat落ちが早いので次スレを立てられる人お願いします

982 :デフォルトの名無しさん:2011/02/14(月) 15:59:11
すみなせん すれたてれませんでしたすみなせん

983 :デフォルトの名無しさん:2011/02/14(月) 16:58:02
所詮p2だった
----

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

このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

http://www.perl.org/get.html
● 2011/02/14 現在の最新版: 5.12.3

▼ 前スレ
Perlについての質問箱 45箱目
http://hibari.2ch.net/test/read.cgi/tech/1287755129/
リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-7 あたり

984 :デフォルトの名無しさん:2011/02/14(月) 16:59:22
[プログラミング自体の経験が無い奴はまずココを読め]
Perl プログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/9784873114279/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://ascii.asciimw.jp/books/books/detail/4-7561-3057-7.shtml
クックブック: 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/
perldoc.jp: ttp://www.perldoc.jp/
perldoc.perl.org: ttp://perldoc.perl.org/

985 :デフォルトの名無しさん:2011/02/14(月) 18:33:07
my @founds = ();
for(my $i = 0; $i < @words; $i++) {

if($words[$i] =~ $y){
push(@founds, $i);
}

}


986 :デフォルトの名無しさん:2011/02/14(月) 19:06:52
スレは立てられたけど連投規制でテンプレをコピペしきれなかった

http://hibari.2ch.net/test/read.cgi/tech/1297677532/

あと>>6と↓
[過去スレ3]
41 http://pc12.2ch.net/test/read.cgi/tech/1249581780/
42 http://pc12.2ch.net/test/read.cgi/tech/1257139591/
43 http://pc12.2ch.net/test/read.cgi/tech/1266565626/
44 http://hibari.2ch.net/test/read.cgi/tech/1280541200/
45 http://hibari.2ch.net/test/read.cgi/tech/1287755129/

987 :デフォルトの名無しさん:2011/02/14(月) 19:57:49
ほいさ
乙でした

988 :デフォルトの名無しさん:2011/02/14(月) 20:02:42
968と987は会場のごみ広いとかイス片付けとか色々やったあと

ほいさ、乙でした っていってそうだね

989 :デフォルトの名無しさん:2011/02/14(月) 22:56:55
>>979,985
教えてくださってありがとうございます
この方法がわからずに行き詰っていたので、本当に助かりました

990 :デフォルトの名無しさん:2011/02/15(火) 16:15:31
Skypeにこんな構文があったとは驚き

Skypeチャットに裏ワザ、送信後のメッセージを修正するコマンド
http://techwave.jp/archives/51594968.html

244 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)