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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
"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についての質問箱 28箱目
http://pc8.2ch.net/test/read.cgi/tech/1162273941/

リンク集は>>2-3
過去スレは>>4
2デフォルトの名無しさん:2006/12/21(木) 22:36:10
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/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/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
3デフォルトの名無しさん:2006/12/21(木) 22:36:40
4デフォルトの名無しさん:2006/12/21(木) 22:37:13
5デフォルトの名無しさん:2006/12/21(木) 22:38:30
>>1 乙でし
6 ◆TWARamEjuA :2006/12/21(木) 22:56:34 BE:4574276-BRZ(6677)
(´-`).。oO(「埋め」やっているやつは石器時代の人間か?)
7デフォルトの名無しさん:2006/12/21(木) 23:05:10
>>6
現代人なら何するの?
8デフォルトの名無しさん:2006/12/21(木) 23:13:39
ごめんね、おかあさんじょーくでquineかきこんだから、ごめんね

前スレ>>985
一応答えておきましょう。2変数の値の交換。
($x, $y) = ($y, $x)
で$xに$yの値を代入して、$yに元の$xの値を代入

if ($x < $y) { ($x, $y) = ($y, $x) }
で、$xのほうが小さかったら$yと入れ替える。つまり$xのほうが大きくなるようにすると言う意味。
9デフォルトの名無しさん:2006/12/21(木) 23:29:13
>>7
1000まで無駄なく使う、ってわざわざ言わなきゃわからないのか?
10デフォルトの名無しさん:2006/12/21(木) 23:38:48
スレ隔てると中途半端になりそうな気もするがね。
11デフォルトの名無しさん:2006/12/21(木) 23:42:00
C/C++も、Javaも、Rubyも、Pythonも宿題スレがあるんだな。
だから空気の読めない初心者が混ざるのか。
12デフォルトの名無しさん:2006/12/22(金) 00:03:24
ちゃんと問題そのものを載せてくれるとまだ良いんだけどな
13デフォルトの名無しさん:2006/12/22(金) 01:30:06
>>11
質問箱なんだから初心者が来るのは構わないんだけど結局>>12の言うとおりじゃない?
14デフォルトの名無しさん:2006/12/22(金) 01:58:54
問題そのものを載せないのもそうだが
コードが動かないときに自分の思いこみでコードの一部分だけ切り出して貼ったり
途中までやったけど分かりませんって書いて コードは一行もなかったり
15GOLFer名無しさん:2006/12/22(金) 02:27:18
@t=($x=1,$y=2,$z=3);
$w=($l=@t)**2;
{$j = 0;while(1){$i=0;while(1){@t[$i,$i+1]=
([$t[$i]=>$t[$i+1]]->[$t[$i]<=$t[$i+1]]=>[$t[$i+1]=>$t[$i]]->[$t[$i]<=$t[$i+1]]);
last if$i++==$l;}last if$j++==$w;}}
print "@t";
16デフォルトの名無しさん:2006/12/22(金) 07:52:52
>>1
my @in = qw( 4 2 6 ) ;
my @new ;
for( 0..$#in ){
  my $min = $in[0] ;
  my $ind = 0 ;
  for (0 .. $#in ){
    if ( $min > $in[$_] ){
      $min = $in[$_] ;
      $ind = $_ ;
    }
  } 
  push @new, $min ;
  splice @in, $ind, 1 ;
}
print @new , "\n" ;
17デフォルトの名無しさん:2006/12/22(金) 12:42:52
>>14
なんかエラーがでます。







そのエラーを貼れよ!!
18デフォルトの名無しさん:2006/12/22(金) 22:16:57
○○ if △△ の形の条件分岐とかって使ってる? 俺は使ってないんだが。
19デフォルトの名無しさん:2006/12/22(金) 22:20:55
next ifとreturn ifは使う
20デフォルトの名無しさん:2006/12/23(土) 00:05:34
elseを伴わない場合で処理が1行ならほぼ間違いなく使う。
21デフォルトの名無しさん:2006/12/23(土) 00:12:52
すいません、ちょっと質問です。
jcode.pm で、文字コードを自動判定させると
なんか時々変な判断しませんか。

#別に半角カタカナは使ってはいません。

例:
  $szName = Jcode->new("ほげほげ")->euc;
  ・・・・・たっぷりと文字列処理
  print Jcode->new($szName)->sjis;

#  あれ? なんか化けてる。

  $szName = Jcode->new("ほげほげ".'sjis')->euc;
  ・・・・・たっぷりと文字列処理
  print Jcode->new($szName,'euc')->sjis;

# うん、これならOK. でも引数が多いのは嫌ですね。
22デフォルトの名無しさん:2006/12/23(土) 00:19:52
そもそも、バイト列の並びから文字コードを確実に判定する方法なんてないですよ。
23デフォルトの名無しさん:2006/12/23(土) 01:01:47
だよね
可能なら自動判定は避けるべき
漢字一文字だと一部の漢字は自動判定できないし
cgiの場合なら入力時の漢字コードは決まっていると思うので、元の漢字コードを指定しましょう
2418:2006/12/23(土) 01:44:44
結構みんなバラバラなのね。うちの周りだと使ってる人がほぼゼロだった。
純粋なPGがいないからかもしれないが。
25デフォルトの名無しさん:2006/12/23(土) 01:51:22
関係ないですが

$sql = "select from T_hogehoge where (判定='A')";

てのを書いてて、「あ、右端に顔文字・・・・」と思ってしまいますた。

・・・・余談でつ。
26デフォルトの名無しさん:2006/12/23(土) 02:09:12
>>18
あまり複雑な条件では使わない

my $fh = new IO::File ">hoge";
return undef unless defined $fh;
とか

$str .= "hoge¥n";
$str .= "moge¥n" if $flag;
return $str;
とか
27デフォルトの名無しさん:2006/12/23(土) 03:25:00
>>26
後者は同意だけど、前者は
my $fh = new IO::File ">hoge"
    or return;
と書くおいら

perlstyleに言及があるとおり、場面に合わせて読みやすいであろう方を選択だよね。
28デフォルトの名無しさん:2006/12/23(土) 08:33:59
ソースのインデント増やしたくないから積極的に
利用する(ある意味 next とかの積極利用なんだけど )
29デフォルトの名無しさん:2006/12/23(土) 08:54:26
PBPに
while ( <> ){
 next if !/^(\S+)\s+(\S+)$/ ;
 #ここで$1, $2 の処理をする
}
みたく書いてあったときはある意味衝撃だったw
ええ知らなかっただけですともorz...
30デフォルトの名無しさん:2006/12/23(土) 10:12:42
\ を一々 \ に変えてる奴って頭おかしいの?
31デフォルトの名無しさん:2006/12/23(土) 10:21:08
>>30
Safari厨だと思われ。
32デフォルトの名無しさん:2006/12/23(土) 12:21:42
Vistaになればみんなそうなるのかな?
33デフォルトの名無しさん:2006/12/23(土) 13:43:42
>>32
ならない。
34デフォルトの名無しさん:2006/12/23(土) 16:33:52
useしたモジュールで発生する"Use of uninitialized value"エラーを出力させたくないのですが、
どのようにしたらよろしいでしょうか?
モジュールには手を加えたくないのですが。。
35デフォルトの名無しさん:2006/12/23(土) 16:59:53
perl -w を使わずに use warnings すればいいんじゃね?
3634:2006/12/23(土) 17:21:35
>>35
質問文が分かりにくくてすみません;

#program start
use hogehoge 'hoge';
print hoge('unko');
#program end
例えば、上記のプログラムを実行して標準出力に出力される、
"Use of uninitialized value in %s at hogehoge.pm line 30."
というエラーの出力を止めたいのです。。
37デフォルトの名無しさん:2006/12/23(土) 17:52:44
>>36
つまり何か。hogehogeモジュールがその中でwarningsプラグマを有効にしているにも拘らず、
正常な処理の範囲内でundefinedな値のチェックを怠っていて、しかも、
他の人が作ったモジュールだから触るわけには行かない。とそういう状況なわけか。
3834:2006/12/23(土) 18:01:53
>>37
Yes!まさにその通りです!
39デフォルトの名無しさん:2006/12/23(土) 19:03:35
レキシカルな特殊変数に干渉する方法がわからん…
一応、思いついたDirty Hack二通り
1.
BEGIN { local *warnings::import;
require hogehoge; import hogehoge 'hoge'; }

2.
{ use IO::Null;
tie local *STDERR, 'IO::Null';
print hoge('unko'); }
40デフォルトの名無しさん:2006/12/23(土) 19:37:17
いったんhogehogeにパッケージ切り替えてno warnings 'uninitialized';したら?

use hogehoge qw/hoge/;

package hogehoge;
no warnings qw/uninitialized/;

package main;

print hoge('unko');

試してないからわからん。
41デフォルトの名無しさん:2006/12/23(土) 20:11:47
表示されなければいいのなら$SIG{__WARN__}を定義して横取りする手もある。

The routine indicated by $SIG{__WARN__} is called when a warn-
ing message is about to be printed. The warning message is
passed as the first argument. The presence of a __WARN__ hook
causes the ordinary printing of warnings to STDERR to be sup-
pressed.
4234:2006/12/23(土) 23:26:18
>>39-41
ありがとうございます _ _
>>39さんの1の方法を使わせていただきました。
>>40
no useは地の文での解釈となってしまうようでした。
43デフォルトの名無しさん:2006/12/24(日) 12:18:30
perl で PDFからテキストコンバータしたいんだけど、そんなモジュールってある?
44デフォルトの名無しさん:2006/12/24(日) 12:34:08
45デフォルトの名無しさん:2006/12/24(日) 12:36:07
CPANでそうやってけんさくするのか。
 ありがとう。
46デフォルトの名無しさん:2006/12/24(日) 15:04:19
WindowsのActivePerl-5.8.8.819-MSWin32-x86-267479.msiでインストールしたパッケージに
Jcode.pmと新しいEncode.pmとEUCJPMSをインストールしようとしましたが、
Jcode.pm以外はインストールできませんでした。
Encode.pmの場合は
NMAKE : fatal error U1077: 'C:\MSVSEE\VC\bin\cl.EXE' : リターン コード '0x80'
Stop.
NMAKE : fatal error U1077: 'C:\MSVSEE\VC\bin\nmake.exe' : リターン コード '0x2'
Stop.
EUCJPMSの場合は
NMAKE : fatal error U1077: 'C:\MSVSEE\VC\bin\cl.EXE' : リターン コード '0x80'
Stop.
このようになり、Makefileからmakeできませんでした。
ほかにインストールする方法はないものでしょうか。
47デフォルトの名無しさん:2006/12/24(日) 17:36:55
「4の倍数」や「4で割り切れる」という条件は、どのように表したらよいのでしょうか?
48デフォルトの名無しさん:2006/12/24(日) 17:51:58
>>47
if ($num % 4 == 0)
49デフォルトの名無しさん:2006/12/24(日) 18:18:20
>>46
ppm install
5046:2006/12/24(日) 19:14:23
すいません自己解決しました。
vcのincludeやlibへのパスがうまく通っていなかったようです。
設定しなおしたらmakeできました。

>>49
ppmでやろうと思ったらそんなもんねーよとppmに怒られてしまいました。
5147:2006/12/24(日) 20:06:57
2で割り切れても50で割り切れない
上記のようなものはどう表示すればよいのでしょうか?
52デフォルトの名無しさん:2006/12/24(日) 20:14:04
これはひどい
5347:2006/12/24(日) 20:25:26
事故解決しました
54デフォルトの名無しさん:2006/12/24(日) 20:27:39
>>51
if(2で割り切れる? = はい){
 if(50で割り切れる? = いいえ){
  print "2で割り切れるけど、50で割り切れないよ。";
 }
}
55デフォルトの名無しさん:2006/12/24(日) 20:35:28
>>50
解決して何より。
だけどppmはリポジトリを追加するともっと強力になるよん。
Encodeの最新版はTheoryx5リポジトリにある。
Encode-EUCJPMSは検索したらパッケージを作ってる人がいました。
ttp://asakura.g.hatena.ne.jp/asakura-t/20061102/1162451401
56デフォルトの名無しさん:2006/12/24(日) 21:02:59
>>50
ppm では
search hoge* してからにすべし

Foo::bar というモジュール名は
経験上、ppm では install Foo-Bar の名称で指定することが多し。

<ちらしの裏>
追記すると、最新の ActivePerl (Win32) では
ppm だと GUIウインドウが開く。
ppm-shell だと、従来通りのコマンドライン版が起動する。
</ちらしの裏>
57デフォルトの名無しさん:2006/12/24(日) 23:13:43
perlって何を造るための言語なんだ?
結局はWeb関連だったらツマランわ
58デフォルトの名無しさん:2006/12/24(日) 23:17:02
聖夜釣ですか
59デフォルトの名無しさん:2006/12/24(日) 23:35:41
Spreadsheet::WriteExcelでは既存のファイルを開けないことが判明orz
VBAコードを仕込んでおきたかったんだけど、なんかうまい方法はないでしょうか。
Linuxサーバ上でやりたいため、WIn32::OLEという解は使えません…。
60デフォルトの名無しさん:2006/12/25(月) 13:28:50
>>57
Perl is a programming language for getting your job done.
61デフォルトの名無しさん:2006/12/25(月) 18:56:23
すみません。どなたか教えてくださいませ。
コード値を文字にしたいのですが、日本語はどのようにしたらよろしいのでしょうか?
chrは2バイト文字はだめってのはわかったんですが。
ちなみにシフトJISのコードを変換したいです。
例 0x82A0 → あ
62デフォルトの名無しさん:2006/12/25(月) 19:17:21
$str = pack("H*","82A0");
6361:2006/12/25(月) 19:22:37
>62
ありがとうございます!
packの奥は深いっすね〜
もっと勉強します!
64デフォルトの名無しさん:2006/12/25(月) 21:15:28
>>60
ワロタ
65デフォルトの名無しさん:2006/12/26(火) 01:22:43
今日からオライリーのPerlの本で勉強始めます。
来月から仕事で使いそうなんで・・・
66デフォルトの名無しさん:2006/12/26(火) 01:33:16
ここは俺の日記帳だからお前は日記を書くな
67デフォルトの名無しさん:2006/12/26(火) 01:39:30
chomp
68デフォルトの名無しさん:2006/12/26(火) 03:21:37
質問

文字化けする理由を教えてください。

スクリプト
-------------------
$str="あー";
print $str;
print "\n";
$tmp="−";
$str =~ s/$tmp//g;
print $str;
--------------------

実行結果
--------------------
あー
あ[
--------------------
6968:2006/12/26(火) 03:24:04
追記
環境Windowsで.plファイルのエンコードはShift-JISです。
実行結果はコマンドプロンプトでの実行結果です。
70デフォルトの名無しさん:2006/12/26(火) 03:58:22
− = 81 7c
| = 7c
より、$str =~ s/$tmp//g;は
$str =~ s/(文字コード81)|//g;とPerlに解釈されています。
つまり、$str内の文字コード81か、空文字にマッチングしそれが削除されます。
あー = 82 a0 81 5b内の81を削除すると82 a0 5bとなり
これをShift_JISで表示すると[ = 5bよりあ[となります。
7168:2006/12/26(火) 04:50:18
>>70
丁寧な解説ありがとうございました。

$tmp="−";
$str =~ s/$tmp//g;

$str =~ s/\x81\x7c//g;
とすることによって解決できました。
72デフォルトの名無しさん:2006/12/26(火) 10:26:52
そうくるかw
73デフォルトの名無しさん:2006/12/26(火) 11:46:16
Perl4時代の息吹を感じました。
74デフォルトの名無しさん:2006/12/26(火) 16:00:24
すみません、CPANにあるHTML::TableExtractについての質問です。
http://search.cpan.org/dist/HTML-TableExtract/lib/HTML/TableExtract.pm
↑のREGULAR METHODSにあるdepths()メソッドの文字を変数に代入したいんです。。
然るべき手順を踏んで、
print $te->depths();
するときちんとdepths()メソッドの文字が表示されるのですが、
my $test = $te->depths();
print $test;
すると"Use of uninitialized value in print"というエラーが出てしまいます。。
全く訳が分からず打ち間違えを確認したりして同じ事を何回も繰り返したりしたのですが、
訳が分からないです。。どなたがご助言お願いいたします _ _
75デフォルトの名無しさん:2006/12/26(火) 16:03:36
>>66
      r;ァ'N;:::::::::::::,ィ/      >::::::::::ヽ
.      〃  ヽル1'´        ∠:::::::::::::::::i
       i′  ___, - ,. = -一   ̄l:::::::::::::::l
.      ! , -==、´r'          l::::::/,ニ.ヽ
      l        _,, -‐''二ゝ  l::::l f゙ヽ |、
        レー-- 、ヽヾニ-ァ,ニ;=、_   !:::l ) } ト
       ヾ¨'7"ry、`   ー゙='ニ,,,`    }::ヽ(ノ  2ちゃんはみんなの日記帳だから
:ーゝヽ、     !´ " ̄ 'l,;;;;,,,.、       ,i:::::::ミ
::::::::::::::::ヽ.-‐ ト、 r'_{   __)`ニゝ、  ,,iリ::::::::ミ    
::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、:::::`"::::::::::::::;゙ ,  な!
:::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::///
:::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /
7674:2006/12/26(火) 16:04:22
ごめんなさい。配列型で返ってきてました。。
77デフォルトの名無しさん:2006/12/26(火) 16:26:50
>>73
use utf8を使えば文字を直接置換できるかな?
78デフォルトの名無しさん:2006/12/26(火) 16:43:49
79デフォルトの名無しさん:2006/12/27(水) 02:04:44
パール無図杉
80デフォルトの名無しさん:2006/12/27(水) 23:00:18
すみません、質問があります。
WindowsのActive Perl v5.5.8です。
UTF16の日本語ファイルを開いて処理させようとすると
処理結果のテキストが文字化けしてしまいます。
Shift JISとUTF8形式だと問題なく処理できるのですが…。
UTF16でうまく処理できる方法はないでしょうか?
81デフォルトの名無しさん:2006/12/28(木) 01:01:06
>>80
シフトJISのファイルを扱うとき、
binmode STDOUT, ":encoding(cp932)";
binmode STDERR, ":encoding(cp932)";
binmode STDIN, ":encoding(cp932)";
use open IO => ":encoding(cp932)";
とか書かなかった?
cp932 を例えば、UTF-16LE に変えれば済むことと思われるが。
82デフォルトの名無しさん:2006/12/28(木) 01:12:53
>>80
前スレがまだ残っているので、前スレ 694 からの流れを参照。
対策としては、前スレ 703 のリンク先にある方法が無難だと思う。
83デフォルトの名無しさん:2006/12/28(木) 01:24:39
>>81さん
シフトJISのときは何も指定せずにいけました。
>>82さん
ありがとうございます。
明日頑張ってみます。
84デフォルトの名無しさん:2006/12/28(木) 11:31:19
Activeperl でタイムアウトを指定してホスト名を逆引き(gethostbyaddr)
するプログラムを書いています。タイムアウトした場合にはIPアドレスを
返そうと思います。そこで以下のようなサブルーチンを書いたのですが、
タイムアウトしません。古いActiveperlではalarmがないとの情報があった
のですが、sleep行で確認した所、5.8.8では問題ないようです。
お知恵を拝借頂ければ幸いです。

sub resolv_host {
my ($ip)=@_; my $timeout=2; my $host;
$SIG{ALRM} = sub { die 'TIMED OUT' };
eval {
alarm($timeout);
# ホスト名を逆引きする。
#sleep 5;
$host = gethostbyaddr(pack("C4", split(/\./, $ip)), 2);
alarm(0);
};
alarm(0);
if ( $@ =~ /TIMED OUT/ ){ $host = $ip;}
return ($host);
}

※実行環境は以下の通りです。

Windows XP SP2
Activeperl 5.8.8
85 ◆TWARamEjuA :2006/12/28(木) 13:23:20 BE:2178454-BRZ(6677)
Net::DNS を利用するのはいかがかしら?
86デフォルトの名無しさん:2006/12/28(木) 17:31:04
他所様のサーバの混雑具合を調べるプログラムを書こうとしています。

use IO::Socket;
my $sock = IO::Socket::INET->new(
 PeerAddr => $ip,
 PeerPort => $port,
 Proto => 'tcp',
 Timeout => $TIMEOUT,
);
if ($sock) {
 #接続成功
} else {
 #タイムアウト
}

今現在のコードがこんな感じでして、繋がる繋がらないは分かるのですが、
接続に要する時間を調べたいもののその方法がわかりません。
SOCKETを触るのが今回初めてでして、
そもそもにおいて根本的な過ちを犯してる場合はそちらも併せて、
何かよい方法がありましたら、ご教授いただけると幸いです。
87デフォルトの名無しさん:2006/12/28(木) 17:43:14
普通に前後で現在時間を求めて引き算すればいいのでは?
88デフォルトの名無しさん:2006/12/28(木) 17:58:48
>>85
ありがとうございました。

sub resolv_host {
use Net::DNS;
my ($ip)=@_; my $timeout=2; my $host;
my $res = Net::DNS::Resolver->new(
tcp_timeout => $timeout, udp_timeout => $timeout
);

my $query = $res->query("$ip");
if ($query) {
foreach my $rr ($query->answer) {
next if $rr->type ne "PTR";
$host=$rr->ptrdname;
}
}
else { $host=$ip; }
return ($host);
}
89名無しさん@Linuxザウルス:2006/12/28(木) 18:54:03
任意の文字列からhttpで始まる単語(区切りはスペース)を切り取るにはどうしたらいいでしょうか
$str = aaaa bbbb ccc http://ddd.vv.vv hhhh rrrr http://ff.ff.mm
という文字列から「http://ddd.vv.vv」「http://ff.ff.mm」を切り出す方法です
90デフォルトの名無しさん:2006/12/28(木) 18:59:42
@a = grep /^http/, split / /, $str;
91デフォルトの名無しさん:2006/12/28(木) 19:05:18
@a = $str =~ /(?:^| )(http.*?)(?: |$)/g;
92デフォルトの名無しさん:2006/12/28(木) 19:53:46
>>55
>>56
遅くなりましたが、ありがとうございました。
レポジトリを追加したらだいぶ便利になりました。
パッケージをダウンロードしてきてそのまま追加することもできるようになりました。
93名無しさん@Linuxザウルス:2006/12/28(木) 20:04:48
>>90,91
サンクス
94デフォルトの名無しさん:2006/12/28(木) 20:45:12
「後ろにtringが続かないs」を「z」に置換する方法は次の2つ以外にありますか?

s/s$/z/;
s/s([^t])/z$1/g;
s/st([^r])/zt$1/g;
s/str([^i])/ztr$1/g;
...

s/string/(あり得なさそうな文字列)/g;
s/s/z/g;
s/(あり得なさそうな文字列)/string/g;
95デフォルトの名無しさん:2006/12/28(木) 20:48:34
>>94
先読み否定。色々仲間があるので詳細はperlre参照。
s/s(?!tring)/z/g;
96デフォルトの名無しさん:2006/12/28(木) 21:14:01
任意の精度の数値演算したいんですけど、
どうすればいいでしょうか?
97デフォルトの名無しさん:2006/12/28(木) 21:16:21
あ、Math::BigFloat モジュールってのがありました
すいません m(__)m
98デフォルトの名無しさん:2006/12/28(木) 21:17:16
>>95
ありがとうございました。
99デフォルトの名無しさん:2006/12/29(金) 05:18:57
FTPプロトコルでリモートにファイル転送するスクリプトを作ってるのですが
ローカルとリモートで同名だけどリモートの方がファイルサイズ小さい場合
差分のみ転送にしたいのですがレジュームはどうやればできますでしょうか?
perldoc Net::FTP
でresumeをキーに検索したのですが見当たりませんでした。
よろしくお願いします。
10099:2006/12/29(金) 08:20:07
自己レス

FTP resume perlをキーにググッたら下記の情報見つけた
http://www.garayed.com/perl/215162-net-ftp-resume-file-transfer.html

perldoc Net::FTPでWHEREを見ろって書いてあったので見たら
ダウンロードはgetメソッドの第3引数でオフセット値が指定できるみたいだけど
アップロードはrestartってメソッドでオフセット値をセットしてから
putメソッドで転送すればいいのかな。

しかしputメソッドは第3引数でオフセット値を指定できないんだ???
101デフォルトの名無しさん:2006/12/29(金) 08:59:14
どこまできちんと届いているかは、クライアントしか知らないから、
レジュームって普通クライアントから要求するようになってると思うよ。
102デフォルトの名無しさん:2006/12/29(金) 09:29:59
>>100
Net::FTPだったらputじゃなくてappendにしないと上書きされちゃうよ

>>101
99は具体的なやり方聞いてるのにそんな回答しても意味ネェだろw
103デフォルトの名無しさん:2006/12/29(金) 12:03:50
Perllこついての質問箱?
104デフォルトの名無しさん:2006/12/29(金) 12:08:27
Jcode::CP932
Encode::EUCJPMS
をインストールした後
use Jcode::CP932とするとエラーになってしまいます。

エラー内容
Jcode::CP932 is not an object at (eval 2) line 234
Jcode::AUTOLOAD('Jcode::CP932', 'sjis', 'cp932', 'euc', 'cp51932', 'jis', 'cp50221', 'iso_2022_jp', 'cp50220', ...) called at c:/usr/local/site/lib/Jcode/CP932.pm line 39
main::BEGIN() called at c:/usr/local/site/lib/Jcode/CP932.pm line 0
eval {...} called at c:/usr/local/site/lib/Jcode/CP932.pm line 0

Jcode.pmのAUTOLOADでconfessしてるっぽいんですが、何故動かないのでしょうか?
ちなみにWinXP、ActivePerl 5.8.7.813です
105SONY:2006/12/29(金) 15:18:48
>>104
仕様です
106デフォルトの名無しさん:2006/12/29(金) 16:12:31
GK涙目wwwwwwwwwwwww
107デフォルトの名無しさん:2006/12/29(金) 17:03:26
-----------------
これhttp://www.example.com/1.txt とttp://www2.example.com/2.txt これ
-----------------

この上の文を下の文に変換する"スマートな"方法としてはどのようなやり方がありますでしょうか?

-----------------
これ<a href="http://www.example.com/1.txt">http://www.example.com/1.txt</a> と<a href="http://www2.example.com/2.txt">ttp://www2.example.com/2.txt</a> これ
-----------------

仕様としましては

(1)http://またはhttps://またはttp://またはttps://で始まる場所をURL先頭とする
(2)半角空白または全角空白の登場、または文の末尾でURLの最後判定をする
(3)一行に複数のhttp://〜やttp://〜があっても全てにAタグを付ける
(4)Aタグをつけること以外の文章の加工をしない

です。
100stepくらい使えば書けないことはないと思うのですが、
スマートな方法は全く思いつきませんorz
108デフォルトの名無しさん:2006/12/29(金) 17:17:46
なあ、次スレからテンプレートにこれを追加しない?
実は、オレもJperl から Active Perl に移行するとき、
これが解るまでかなり時間がかかった覚えがあるんだけど。

---------------------------------------------------------
#  【Perl 日本語処理の基礎の基礎】
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま(シフトJIS形式の)ソースファイルに保存して下さい。
# 入出力ともシフトJIS形式のファイルまたはDOS窓を想定しています。
# 文字コードの条件が異なる場合には編集が必要です。
# 編集の仕方はご自分で勉強するか、このスレで質問して下さい。
# まず、以下の行を先頭に入れて下さい。
use encoding "cp932";
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
# 次に、あなたが実行したい処理の内容を入れて下さい。
print "やあ!\n";
sleep(1);
109デフォルトの名無しさん:2006/12/29(金) 17:24:21
use encodingは弊害がでかすぎるかと…。
110デフォルトの名無しさん:2006/12/29(金) 17:26:35
>>107
要するにhttp urlの正規表現が解ればいいわけね。
http://www.din.or.jp/~ohzaki/perl.htm#httpURL
111デフォルトの名無しさん:2006/12/29(金) 17:31:39
>>110
>要するにhttp urlの正規表現が解ればいいわけね。
違うッスorz

(1)(2)だけなら $line =~ /(h?)(ttps?:\/\/[^ |^ ]+)/ で。。。
112デフォルトの名無しさん:2006/12/29(金) 17:34:07
>107

use strict;
use warnings;

while (<DATA>) {
s{(h?ttps?://([^\s ]+))}{<a href="http://$2">$1</a>}g;
print $_;
}

__DATA__
これhttp://www.example.com/1.txt とttp://www2.example.com/2.txt これ

URLのパターンマッチはこれだと甘いけど。

>108
use encodingはきちんと理解して使わないとバグの元にしかならないから反対。
113デフォルトの名無しさん:2006/12/29(金) 17:35:35
s{(h?(ttps?://[^\s ]+))}{<a href="h$2">$1</a>}g;
ごめん、間違えた。
114デフォルトの名無しさん:2006/12/29(金) 17:37:13
全角空白って文字クラスにそのまま放り込んで大丈夫なんかいな
115108:2006/12/29(金) 17:43:36
>>109 >>112
確かにね。
これから始める人なら、ソースはUTF-8に統一して
もらったほうがいいかもね。これでいいかな?
---------------------------------------------------------
#  【Perl 日本語処理の基礎の基礎】
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。
# 入出力ともシフトJIS形式のファイルまたはDOS窓を想定しています。
# 文字コードの条件が異なる場合には編集が必要です。
# 編集の仕方はご自分で勉強するか、このスレで質問して下さい。
# まず、以下の行を先頭に入れて下さい。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
# 次に、あなたが実行したい処理の内容を入れて下さい。
print "やあ!\n";
sleep(1);
116109:2006/12/29(金) 18:24:42
>>108=115

乙!
WindowsのActivePerl初心者による
似たようなQ&Aの再生産を回避するために
テンプレートを設置しようというのはとてもすばらしいッス!
でも、

 ・テキストモードとバイナリモード
 ・ASCIIとマルチバイトコード
 ・日本でのマルチバイトコードは複数の種類が存在すること
 ・UTF-8以外でのマルチバイトコードの扱い

を理解してないと結局はすぐにつまづくと思う。
でも、これを丁寧に説明してるとテンプレートで紙面が足りないから
結局「http://〜を読んで」、「binmode, Encodeでググると吉」
ってなっちゃうんだよね。。。

次ぎスレに115のテンプレを追加して様子を見るのがいいのかな。
117デフォルトの名無しさん:2006/12/29(金) 18:40:57
両方うぜーよwebprogでやれ
118109:2006/12/29(金) 21:07:36
>>117 うぜぇのは同意だけど、ウェブはかんけぇねだろバーカw
119デフォルトの名無しさん:2006/12/29(金) 21:10:13
レベル的に物凄く関係ありまふ
120デフォルトの名無しさん:2006/12/29(金) 21:15:52
くだすれPerlだな
121デフォルトの名無しさん:2006/12/29(金) 21:24:28
117のスルー力たんないからスレが荒れたな。
スルー力身につくまでおまえがROMるかwebprog行ってろ
122デフォルトの名無しさん:2006/12/29(金) 22:30:03
>>104
Jcode.pmにパッチあててなくね?
123デフォルトの名無しさん:2006/12/29(金) 22:46:19
するーかって何だよ
スルメイカかよ
124デフォルトの名無しさん:2006/12/29(金) 23:08:30
>>123
どうも「スルーする力(ちから)」という意味みたいだな。
それより、>>117にぴったりのスレがあるぞ。こっちで活躍したらどうだ

【Perl上級者コーナーPart01】
http://pc8.2ch.net/test/read.cgi/php/1024741312/l50
125デフォルトの名無しさん:2006/12/29(金) 23:24:05
ゾーキャスラー力を思い出す流れだが、まぁ通じないだろう。
126107:2006/12/30(土) 00:21:53
>>112,113

できました!ありがとうございましたm(_ _)m
127デフォルトの名無しさん:2006/12/30(土) 09:48:58
128デフォルトの名無しさん:2006/12/30(土) 09:53:09
Срука
129デフォルトの名無しさん:2007/01/01(月) 03:05:23
kent-web の sunbbs.cgi を改造しまくって使っています。
記事番号が奇数番号のときと偶数番号のときとで、
交互に違う情報を入れたいと思っているのですが、
perl で偶数と奇数を判別するのってどうやればいいんでしょうか?
130デフォルトの名無しさん:2007/01/01(月) 03:07:15
%2
131デフォルトの名無しさん:2007/01/01(月) 03:14:40
132デフォルトの名無しさん:2007/01/01(月) 03:22:34
>>129
2で割った余りが0なら偶数、1なら奇数と判定すればOK
133デフォルトの名無しさん:2007/01/01(月) 07:26:19
1 と and とって1ビット目が 0 か 1 かで判断してもおk
134デフォルトの名無しさん:2007/01/01(月) 15:02:29
>>132-133
例文でお願いしますです。orz
135デフォルトの名無しさん:2007/01/01(月) 15:12:55
>>134
この程度のこともわからないのに
>kent-web の sunbbs.cgi を改造しまくって使っています。
なのか
136デフォルトの名無しさん:2007/01/01(月) 15:22:34
>>134

%2
137デフォルトの名無しさん:2007/01/01(月) 18:38:54
巨大な数字ってどういうビット構造なんかな?

$a = 234;

if ( $a & 1) { print "奇数" }
else { print "偶数" }
138デフォルトの名無しさん:2007/01/02(火) 00:43:33
詳解 正規表現
をかったんだよお年玉で
139デフォルトの名無しさん:2007/01/03(水) 10:43:45
WINDOWSの鯖でファイルが書き込み可能かどうかを判断するにはどうしたらいいんですか?
WINDOWS鯖の場合だと
if (-w $write_file_path) { print "書き込み可能\n"; }というプログラムがが使えないんです
140デフォルトの名無しさん:2007/01/03(水) 11:06:17
>>139 == http://pc10.2ch.net/test/read.cgi/php/1164519503/635

マルチなので放置しましょう
141デフォルトの名無しさん:2007/01/03(水) 11:20:32
>>109
>use encodingは弊害がでかすぎるかと…。

kwsk.

 今まで、Jcode->new($hogehoge)->sjis; でちまちま変換していた者としては
 use encoding という技は新味ですyo.
142デフォルトの名無しさん:2007/01/03(水) 14:25:47
うるう年かどうかを判別するプログラムが課題で出ているのですが

$y=1900;

if($y %4==0){
print "$y is a leap year.\n";
}elsif(($y %4==0) && ($y %100==0)){
print "$y is a common year.\n";
}elsif(($y %100==0) && ($y %400==0)){
print "$y is a leap year.\n";
}else{
print "$y is a common year.\n";
}

これで1900を$yに入れても、うるう年になってしまいます。
1900をcommon year.にするには、どうすればよいのでしょうか?
143デフォルトの名無しさん:2007/01/03(水) 14:35:27
>>142
そういうのは400,100,4の順番に判定するんだよ
144デフォルトの名無しさん:2007/01/03(水) 14:45:24
なんてほのぼのする質問だろう
145デフォルトの名無しさん:2007/01/03(水) 14:52:27
正直に課題って言ったのも好感w
146デフォルトの名無しさん:2007/01/03(水) 15:09:31
>>142
最初の条件 $y %4==0 が、「4で割り切れたら」だから、4で割り切れる数字は、
全てここで引っかかっちゃうよ。
147デフォルトの名無しさん:2007/01/03(水) 17:45:10
(´・ω・)ヤサシス
148デフォルトの名無しさん:2007/01/03(水) 20:54:19
なんでうるう年は4年に一回なのに400と100も判定にいれるの?
149デフォルトの名無しさん:2007/01/03(水) 20:55:00
>>148
それは冗談で言っているんだよな。
150デフォルトの名無しさん:2007/01/03(水) 21:13:58
愉快なスレだな
151デフォルトの名無しさん:2007/01/03(水) 21:22:42
use DateTime;
my $y = 1900;

if (DateTime->new(year => $y)->is_leap_year) {
  print "$y is a leap year.\n";
} else {
  print "$y is a common year.\n";
}

こうですか? よくわかりません><
152デフォルトの名無しさん:2007/01/03(水) 21:25:31
アッー!
153デフォルトの名無しさん:2007/01/03(水) 21:27:16
>>151
反則です
154デフォルトの名無しさん:2007/01/03(水) 21:31:37
しかし >>142 にはモジュールを使ってはいけないなんて一言も(ry


まあ冗談だろうけど、実際に閏年の判定を書くとしたら >>151 なんだよなぁ・・・。
155デフォルトの名無しさん:2007/01/03(水) 21:41:17
>>149
まあ、今後 90年以上は >>148 が正しいわけだが。
156デフォルトの名無しさん:2007/01/03(水) 21:41:24
でもデフォルトで入ってたっけ?
157デフォルトの名無しさん:2007/01/03(水) 21:50:31
最新のactiveperlには入ってた。
158デフォルトの名無しさん:2007/01/03(水) 22:00:08
>>142の心温まる条件式を眺めてると、質問者に>>151を見て欲しくない気持ちになってきた。
159デフォルトの名無しさん:2007/01/03(水) 22:20:40
4000年で割り切れる年も入れないとね。
160デフォルトの名無しさん:2007/01/03(水) 22:34:26
>>159
どんだけ先の話やねん
161デフォルトの名無しさん:2007/01/03(水) 22:51:30
つ 「このように広く普及するのであれば、もっとちゃんとした設計を施すべきだった」
162デフォルトの名無しさん:2007/01/03(水) 22:59:36
そんなに長いこと使われないだろうと思って作ったソフトが2000年問題とかの原因になったんだよな
1993年使われ続けることも考慮しとくべきだな
163デフォルトの名無しさん:2007/01/03(水) 23:02:58
sub is_leap_year {
    $j = shift() + 660;
    unless ($j % 4) {
        unless (($j - 660) % 100) {
            return 0 unless ((($j - 660) / 100) % 4);
        }
        return 1;
    }
    return 0;
}

どぞ。
164デフォルトの名無しさん:2007/01/03(水) 23:04:31
だが、心配のしすぎではないか。
165デフォルトの名無しさん:2007/01/03(水) 23:08:42
もうまもなく4000年になろうとしているのに4000で割り切れる年を閏年にすべきか否かは未だ意見の分かれるところだね。
地球の自転が遅くなるからとか言うが。小賢しい。
166デフォルトの名無しさん:2007/01/03(水) 23:10:06
そういってy2kが問題になってたんじゃないか。
だいたい時間を1970/01/01 00:00からの32bit整数であらわすのも心配だな。やっぱり64bitはほしいところだ。
167デフォルトの名無しさん:2007/01/03(水) 23:20:41
符号付 64ビット整数で紀元からのピコ秒数で数えることにすると紀元の前後300年弱しか表せない。
168デフォルトの名無しさん:2007/01/03(水) 23:26:13
perl -e "print scalar(localtime(0xffffffff/2));"
だと「Tue Jan 19 12:14:07 2038」って出るが

perl -e "print scalar(localtime(0xffffffff/2+1));"
だと何も表示されないな

perlは普通にでかい値扱えるから
localtime関数も符号付32bitの上限超えても平気かと思ってたがだめなのか
169デフォルトの名無しさん:2007/01/04(木) 00:32:15
じゃあ紀元から符号付で128bitあれば足りるかな。
170 ◆TWARamEjuA :2007/01/04(木) 00:35:18 BE:5336677-BRZ(6700)
コンパイル時に指定してあげれば、、、@64bits
171デフォルトの名無しさん:2007/01/04(木) 09:43:47
ピコ秒って光が30cmしか飛べないんだぜ。
原子時計の精度が1ピコ秒なんだぜ。
どうやって計るんだぜ?
172デフォルトの名無しさん:2007/01/04(木) 13:46:03
>>168
表示はされたけど1901年だったわさ
173デフォルトの名無しさん:2007/01/04(木) 19:54:07
>>171
10E-16sオーダの時間の計測に成功したっていうニュースなら見た気がするが。
174デフォルトの名無しさん:2007/01/04(木) 20:23:27
不確定性原理からいくと、最小の時間単位は何だっけ?
175デフォルトの名無しさん:2007/01/04(木) 20:34:09
プランク時間か?
176デフォルトの名無しさん:2007/01/04(木) 23:41:55
当方perl初心者です。
全角スペースを半角スペースに置き換えたく、
~s/\xA1\xA1/\x20/g
としています。スペースの置き換え動作自体はするんですが、「ァー」や「ぁ!」などの文字列が文字化けするようになりました。
文字コードはEUCです。

コードを調べてみると「ぁ!」は
A4 A1 A1 AA となっており、全角スペースと誤認してしまうようでした。
どのように解決したら良いのでしょうか、教えてください。
177デフォルトの名無しさん:2007/01/04(木) 23:49:59
require 5.8.1;
use encoding 'euc-jp';
178デフォルトの名無しさん:2007/01/04(木) 23:50:19
179176:2007/01/05(金) 00:12:36
解決しました。ありがとうございます。
180デフォルトの名無しさん:2007/01/05(金) 13:30:32
さんざんキシュツかもしれませんが、見つからなかったので質問。

Windows XP ActivePerl の環境で、system コマンドで呼び出したプログラムをバック グラウンド で動かしたい。どうすればよい? 例えば、スクリプトはこんな感じ。

---

my $IE = "c:\\Program Files\\Internet Explorer\\IEXPLORE.EXE";
system ($IE, "http://www.hotmail.com");

---

例えば、上記を test.pl としてセーブし、これを DOS 窓から呼びだすと、こんな感じでとまり、別プロセスとして実行してない。

---
C:\Documents and Settings\takasaks>perl e:/work/0my/scripts/test.pl
_

---

別プロセスで動かしたい、どうれすればよいのでしょうか?
181デフォルトの名無しさん:2007/01/05(金) 13:41:21
system(1, ...);

ActivePerl限定だった希ガス
182デフォルトの名無しさん:2007/01/05(金) 13:45:21
日本語が得意なフランス人みたいな日本語だな。
183180:2007/01/05(金) 14:54:17
すげー。うまくいった。ありがとう。m(_ _)m

>>182
確かに今読み直すと変だね。
184デフォルトの名無しさん:2007/01/05(金) 21:25:20
以前、(スクリプトが)短い掲示板がどっかに貼ってあったのですが検索しても見つかりません。
突然もう1度見たいのですが、どなたか知っている方居ませんか?

1行に出来るんだから行数関係ないっていわれそうですが6行くらいで、掲示板として機能していたPerlのプログラムでした。
2chのどこで見たんだったかなぁ、、
185デフォルトの名無しさん:2007/01/05(金) 21:26:55
七行プログラミング part5
http://pc10.2ch.net/test/read.cgi/tech/1142467359/
186デフォルトの名無しさん:2007/01/05(金) 21:32:38
187デフォルトの名無しさん:2007/01/05(金) 22:38:22
>>185-186
それっぽいです。
ありがとうございました。
188デフォルトの名無しさん:2007/01/06(土) 02:56:25
ダイス用のモジュールってありませんか?
$s に 3d20+10 のような文字が入ってたら、20面ダイスを3回振って結果に10を足す、ような。

$s に複数入っててもちゃんと計算してくれるのが良いです。更に言うと 1d6+5-4 のように加算減算も複数扱えると尚良いです。
自作しようかと思ったら結構フクザツで・・・。
189デフォルトの名無しさん:2007/01/06(土) 03:32:00
http://search.cpan.org/~rjbs/Games-Dice-0.99_01/lib/Games/Dice.pm
こんなんあったよ。
あとはsplitしたり調整したりするラッピングするだけで実装できるんじゃない?

そんなマニアックなものあるかよ!と思ったらあったw
恐るべしCPAN
190デフォルトの名無しさん:2007/01/06(土) 03:37:50
置換 + evalで出来るよと言おうとしたけどCPANに真面目なのがあったか。
CPANスゲー
191188:2007/01/06(土) 04:23:08
おおー、CPANにあるんですね!
最近 Perl と離れてたんですが、やっぱり便利だ!

ありがとうございました。
192デフォルトの名無しさん:2007/01/06(土) 21:10:42
正規表現で()を後方参照としてではなく、ただの括弧としてマッチさせたい場合どう書けばいいんでしょうか
193デフォルトの名無しさん:2007/01/06(土) 21:13:44
(?:re)
194デフォルトの名無しさん:2007/01/06(土) 21:14:04
(?:pattern)

つperlre
195デフォルトの名無しさん:2007/01/06(土) 21:34:41
おおぅ、それグループ化のみだと思ってました
ありがとうございます
196デフォルトの名無しさん:2007/01/06(土) 21:39:55
\( ではないのか
197デフォルトの名無しさん:2007/01/06(土) 21:48:35
括弧としてマッチさせるには \( が正しいみたいです
お騒がせしてすみません
>>196 ありがとうございます
198デフォルトの名無しさん:2007/01/06(土) 22:19:53
すいません、ちょっと質問ですが、
Perl モジュールをCPANに登録して公開するときって、
GPLライセンスでいいんですか?
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%83%BB%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9
それとも、この Artistic License ですか?
199デフォルトの名無しさん:2007/01/06(土) 22:26:32
Module::License::Reportなんてのがあるくらいだし
Apache Licenseとかも混じってるし
http://www.google.co.jp/search?num=50&q=site%3Acpan.org+license

なんでもいいんじゃない?
200デフォルトの名無しさん:2007/01/06(土) 23:42:21
>>198
GNUプロジェクトによれば、首尾一貫性と均一性のためにperlと同じライセンス
(GPLとArtistic Licenseのデュアルライセンス)を適用することを推奨されている。

<blockquote cite="http://www.gnu.org/licenses/license-list.ja.html">
Perl のライセンス
このライセンスでは、Artistic ライセンス とGNU GPLのどちらかを選択できるとしています。
言い換えれば、あなたはこれらの2ライセンスのどちらかから選べるということです。
フリーソフトウェアのライセンスに要求される条件は満たしますが、本物のコピーレフトとは言えないかも知れません。
選択肢の一つとして GNU GPLがありますので、GNU GPLとは矛盾しません。

Perl 4 や Perl 5 用のパッケージを書く場合には、Perl プログラミングの世界における首尾一貫性と均一性を促進するために、
このライセンスを適用されることをお勧めします。Perl 以外の分野では、単に GNU GPL を使う方が好ましいので、
このライセンスを使わないよう強くお勧めします。
</blockquote>

が、好きなライセンスにすりゃ良いんじゃない?

ついでにperlmodstyleには
<blockquote>
Licensing
Make sure that your module has a license, and that the full text of it is included in the distribution
(unless it's a common one and the terms of the license don't require you to include it).

If you don't know what license to use, dual licensing under the GPL and Artistic licenses
(the same as Perl itself) is a good idea. See perlgpl and perlartistic.
</blockquote>
とある
201デフォルトの名無しさん:2007/01/07(日) 02:04:43
修正BSDとかMITとかもあるけど。やっぱりGPL/Artisticのデュアルライセンスにしとくのがいいかな。
202デフォルトの名無しさん:2007/01/07(日) 05:25:31
[1-9.]のみで構成される文字列を表示したいのですが

if ( $text =~ "[1-9.]" ) {
 print "$text \n";
}

だとうまくいきません。
どのように修正すればいいですか?
203デフォルトの名無しさん:2007/01/07(日) 05:25:42
(?: って変数に入れないようにするやつでしょ?
204デフォルトの名無しさん:2007/01/07(日) 05:28:07
print "$&\n" if $text =~/[1-9.]/;
205デフォルトの名無しさん:2007/01/07(日) 05:32:00
文字列だった。すまん
一つだけなら
/[1-9.]+/
すべてなら
print(join(',', /[1-9.]+/g));
206デフォルトの名無しさん:2007/01/07(日) 06:01:09
#!c:\usr/bin/perl ←だとアクセスできますが、
#!usr/bin/perl ←だとアクセ500のエラーがでます。
3時間探しましたが答えが見つかりませんでした。
よろしくお願いします。

os:win2000
webserver:apache 2.059
active perl


207デフォルトの名無しさん:2007/01/07(日) 06:04:39
>>206
#!/usr/bin/perl
208デフォルトの名無しさん:2007/01/07(日) 06:05:19
スラッシュ一個たんなくね?

×#!usr/bin/perl
○#!/usr/bin/perl
209デフォルトの名無しさん:2007/01/07(日) 06:09:07
>>207-208
いろいろやっていくうちに"/"が消えてました。
やっとゴールにたどり着きました。ありがとうございました。
210デフォルトの名無しさん:2007/01/07(日) 06:25:02
>>205
説明不足ですみません。

$text = "12:24" なら $textの表示そのものをしない
$text = "3.142" なら表示する

というような不要な文字が1つでもあれば
無視するといった感じのものが作りたかったのです。
よろしくお願いします。
211デフォルトの名無しさん:2007/01/07(日) 06:30:58
$text =~/^[1-9.]+$/ and print "$&\n";
212デフォルトの名無しさん:2007/01/07(日) 06:32:14
printのとこ、$textじゃなくてわざわざ$&で出力する意味あるの?
213デフォルトの名無しさん:2007/01/07(日) 06:35:49
短縮。
214デフォルトの名無しさん:2007/01/07(日) 06:40:16
>>211
無事作成できました。ありがとうございました。
215デフォルトの名無しさん:2007/01/07(日) 07:26:19
2chのdatファイルを、差分で取得したいのですが、どのようにしたらよいのでしょうか?
216デフォルトの名無しさん:2007/01/07(日) 08:09:31
If-Modified-Since と Range をつけて叩いて 206|304|416 のどれかをもらうようにする
217デフォルトの名無しさん:2007/01/07(日) 14:11:53
package の中で、

sub func(\[$@]) {
 my $class = shift;
 my $arg = shift;
}

として、$arg に配列もしくはスカラのリファレンスを受け取りたいのですが、
$arg にはスカラしか入ってくれません。

どう書くのが正解でしょうか?
218デフォルトの名無しさん:2007/01/07(日) 15:06:23
>>202
\. じゃなくてええの?
219デフォルトの名無しさん:2007/01/07(日) 15:44:04
>>218
自分でちょっと試せばいいだろ

print "Matchn" if 'ABC' =~ /[.]/;
220デフォルトの名無しさん:2007/01/07(日) 17:38:56
>>218
文字クラスの中だから
221デフォルトの名無しさん:2007/01/07(日) 20:45:01
>>217
prototypeに頼らないのが正解。
そのprototype、第一引数について書かれてないけど。
222デフォルトの名無しさん:2007/01/07(日) 22:45:16
ppmをつかってモジュールを持ってくるときに、zipで圧縮されてると展開方法を知らんとエラーが出てしまうのですが、
どうすればこのエラーが出なくなるんでしょう。
223デフォルトの名無しさん:2007/01/07(日) 23:28:08
Archive::Zip入ってる?
224デフォルトの名無しさん:2007/01/08(月) 00:48:56
>>223
入ってます。
225デフォルトの名無しさん:2007/01/08(月) 01:27:07
手元だとzipアーカイブでもインストールできるなぁ。どこのリポジトリの何で発現してる?
226デフォルトの名無しさん:2007/01/08(月) 01:49:50
>>225
ためしに再インストールしようとしたArchive::Zipで出てます。。。
何処のレポジトリかはどうやってわかるんでしょうか。
227デフォルトの名無しさん:2007/01/08(月) 08:59:59
csvの一行目を検索して、二行目をprintするだけなんですが
「ー」を含む言葉だと検索結果で出力されません
「。」「・(半角)」「・(全角)」とか色々やったんですが、どうやら「ー」だけのようです
解決方法をよろしくお願いします

open(IN,"$file");
while(1) {
$line = <IN>;
@data = split(/,/ ,$line);
if ( $line eq "" ) { last;}

if ( $data[0] =~ /$in{'test'}/ ) {
print "$data[1]\n";
}

}
close(IN);
228デフォルトの名無しさん:2007/01/08(月) 11:44:40
>>227
CSVファイルを扱うならば、Text::CSV をお使いください。
(Text::CSV_XS かもしれない、手元にソースがない)
229デフォルトの名無しさん:2007/01/08(月) 12:25:03
>>228
返信ありがとうございます
Text::CSVモジュールを使わないと対処できないということでしょうか?
フリーのwebスペースを利用したいので、モジュールはインストール出来ないです

Text::CSV自体は優れものみたいですね
230デフォルトの名無しさん:2007/01/08(月) 12:27:20
>226
えっと、ppmシェルで、

search Archive-Zip

って入力して。

Searching in Active Repositories
1. Archive-Zip [1.18] Archive-Zip

こんな感じに出てくると思う。仮に1番なら

desc 1

って入力したときなんて表示されてる?
231デフォルトの名無しさん:2007/01/08(月) 13:21:02
>>227
つShift_JISの罠
/\Q$in{'test'}\E/

Text::CSVはマルチバイト文字通ったっけ?
Text::CSV_XSでbinaryオプションを与えない駄目だったような記憶が
232デフォルトの名無しさん:2007/01/08(月) 14:02:13
Text::CSVは0x09(Tab)と0x20(Space)から0x7e(Tilde)の範囲しか使えないね。
Text::CSV_XSでbinaryオプションつけないとダメだ。
233デフォルトの名無しさん:2007/01/08(月) 14:07:57
>>231
返信ありがとうございます。おかげで解決することができました
ただ、「\Q」が「\Eまでのメタ文字をリテラルとして判断する」のは別ったのですが
「/$in{'test'}/」←これのどこにメタ文字があるのかが分らないです
解決はしたけど理解出来てない…
234デフォルトの名無しさん:2007/01/08(月) 14:25:47
>>233
「ー」はShiftJISで0x81 0x5Bと表される。この2バイト目が'[' = 0x5B
他にもソ('\')とか+('{')とか色々。

文字コードの割り当て参考資料
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html

ASCIIコード表
ttp://adlib.rsch.tuis.ac.jp/~akira/lect/softa/ascii.html
235デフォルトの名無しさん:2007/01/08(月) 14:31:01
>>233
「$in{'test'}」自体がメタ文字を含むってことじゃなくて、
実行時に変数$in{'test'}にメタ文字を含むShiftJIS文字が入る可能性があるってこと。
236デフォルトの名無しさん:2007/01/08(月) 14:51:17
>>234-235
かなり見当違いな考えをしてたみたいですね
「ー」以外にも注意しなければいけない文字が結構ありますね
ご丁寧にありがとうございました
237デフォルトの名無しさん:2007/01/08(月) 16:52:09
>>230
1: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz <[email protected]>
Provide: Archive::Zip version 1.18
Require: File-Which
Require: PathTools
Repo: trouchelle
CPAN: http://search.cpan.org/dist/Archive-Zip-1.18/
Installed: 1.18 (perl)
2: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Adam Kennedy ([email protected])
Provide: Archive::Zip version 1.18
Provide: Archive::Zip::BufferedFileHandle
Provide: Archive::Zip::MemberRead
Provide: Archive::Zip::MockFileHandle
Require: File-Which
Repo: ActiveState Package Repository
CPAN: http://search.cpan.org/dist/Archive-Zip-1.18/
Installed: 1.18 (perl)
3: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz ([email protected])
Require: Compress-Zlib
Repo: bribes
CPAN: http://search.cpan.org/dist/Archive-Zip-1.18/
Installed: 1.18 (perl)
こんな感じです。
238デフォルトの名無しさん:2007/01/08(月) 17:32:10
>>227
おもったが、他の文字コードに変換してsplitするのはどうよ。
いちばんお手軽。

open(IN,"$file");
while(1) {
$line = <IN>;
$line=Jcode->new($line)->euc;
@data = split(/,/ ,$line);
if ( $line eq "" ) { last;}

if ( $data[0] =~ /$in{'test'}/ ) {
print Jcode->new("$data[1]\n")->sjis;
}

}
close(IN);
239デフォルトの名無しさん:2007/01/08(月) 17:41:21
たまに思うのだが、単なる文字列のスカラを
"$file" とかって、ダブルクォートで括って書くの無駄だよね。
全く同じ内容の、新しい文字列を生成してる訳でしょ?
だったら単に $file って書いた方が効率良いのに。

KENTとか、どっかのサンプルでわざわざ括るようになってるのかな。
こういう書き方してる人が、どこで習ってくるのか知りたい。
240デフォルトの名無しさん:2007/01/08(月) 17:51:09
>>238
$in{'test'}が正規表現の場合の話か。

EUCにするくらいなら、変換に多少コストが掛かるがUTF-8にして処理したほうがいいと思う。
今度は>>176こういう問題が発生する。SJISでも率は低いが起こるけれどね。

ってもしかして元質問も正規表現を入力する質問だったんだろか…
indexの代わりにマッチングを行ってるだけかと思って\Q\Eで答えちゃったけれども

>>239
最近は見ないけれど
print "@hoge";
とやっておいてなんか表示が変だと質問してくる人までいるから困る。

ついでにperlfaq
ttp://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#What_s_wrong_with_always_quoting
241デフォルトの名無しさん:2007/01/09(火) 00:43:01
>>239
あ、それ昔やってた。
なんかprint = ダブルクォート括らないと不安、みたいな気がしてたような。
242デフォルトの名無しさん:2007/01/09(火) 00:46:26
#俺にも
print $a, $b; #とすればいいところを
print $a . %b; #としていた時代や
print "$a$b"; #としていた時代があったなあ
243デフォルトの名無しさん:2007/01/09(火) 01:05:55
カンマは直接に文字連結の意味じゃないから余り好きじゃないなぁ。。
そっちの方が速いんだけどね。
244デフォルトの名無しさん:2007/01/09(火) 01:39:08
強制的に文字列コンテキストに変えたいときとか。
オブジェクトじゃなくてその文字列表現だけ保持したい場合とかあるでしょ。
245244:2007/01/09(火) 01:46:32
ちゃんと読んでなかった。スマソ
246デフォルトの名無しさん:2007/01/09(火) 12:09:24
>>243
散々既出だが、一応突っ込んどく。カンマの方が遲い

use Benchmark ;
my ( $hoge, $moge ) = ( 'hoge', 'moge' ) ;
sub dot { print STDERR $hoge . $moge . "\n" ; }
sub dq { print STDERR "$hoge$moge\n" ; }
sub comma{ print STDERR $hoge , $moge , "\n" ; }
timethese ( 1000000, { op1 => 'dot', op2 => 'dq', op3 => 'comma' } ) ;

$ perl Bench.pl 2> /dev/null
Benchmark: timing 1000000 iterations of op1, op2, op3...
  op1: 15 wallclock secs ( 7.67 usr + 4.81 sys = 12.48 CPU) @ 80128.21/s (n=1000000)
  op2: 12 wallclock secs ( 7.37 usr + 4.67 sys = 12.04 CPU) @ 83056.48/s (n=1000000)
  op3: 22 wallclock secs ( 9.13 usr + 11.23 sys = 20.36 CPU) @ 49115.91/s (n=1000000)
247243:2007/01/09(火) 13:10:54
>>246
初心者でゴメン。Windowsだから、nulに出力して実行してみた。
(Windows XP SP2 ActivePerl5.8)
Benchmark: timing 10000000 iterations of op1, op2, op3...
op1: 12 wallclock secs (11.02 usr + -0.02 sys = 11.00 CPU) @ 909173.56/s
(n=10000000)
op2: 12 wallclock secs (10.87 usr + 0.00 sys = 10.87 CPU) @ 919540.23/s
(n=10000000)
op3: 8 wallclock secs ( 7.02 usr + 0.00 sys = 7.02 CPU) @ 1425516.75/s
(n=10000000)
あれ?最初自分の考えでは関数を二回使ってるカンマの方が遅いと思ってたんだけど、
ベンチしたらドットの方が速いんで>>243を書いた。
なんで結果違くなっちゃうのか誰か教えて〜。
248243:2007/01/09(火) 13:29:23
あー、わかった。Perlでの出力処理はcommaの方が速いけど、
systemのIOでのオーバーヘッドで結果的にdotの方が速いという寸法か。>>246
Windowsで実際にファイルに出力して計測してみると大体同じ(わずかにcommaが速い)になった。
ここらへんはLinuxとWindowsで違うんだろうね。
249デフォルトの名無しさん:2007/01/09(火) 14:06:58
>>246
うんにゃ。

8Bのメモリ確保なら大してコストかからんからサンプルとして不十分じゃないか?。
$hogeが十キロの単位になってくるとカンマが追い抜くんじゃないだろうか。
250デフォルトの名無しさん:2007/01/10(水) 01:42:28
>>248
いや、>>246はSTDERRに出力してるからカンマ区切りが遅くなっているだけ。

STDERRはperl内部でも特別扱いされていて、カンマで区切られた要素毎に fflush される。
なので、STDERRへ出力する場合はカンマ区切りの方が(fflushの増える分だけ)遅くなる。
他のハンドルだと($|=1でも)、普通はカンマ区切りの方が速くなる。
251デフォルトの名無しさん:2007/01/10(水) 04:22:12
えっちだから遅いんだね。
252デフォルトの名無しさん:2007/01/10(水) 15:25:22
フリーウェアのソースを眺めてると、一つのファイルにやたらと機能を詰め込んでるのが
多いように感じるんだけど、これってどうなんだろう。
掲示板だったら、表示.cgi 書込み.cgi とか分けた方が保守しやすいのでは、と。
意見求みまする。
253デフォルトの名無しさん:2007/01/10(水) 15:43:02
>>252
インスコするファイルがたくさんあるとお子様が混乱してしょうもない
質問で邪魔してくるので、ソースメンテする手間はかかるけどトータル
では得らしい。
254デフォルトの名無しさん:2007/01/10(水) 15:51:55
コーディング外の質問です。
今、plファイルのwindows向けのアイコンを何となく作っていますが、
真珠っぽいのがファイルについたアイコンか、らくだの絵のアイコンかどちらがふさわしいと思いますか?
255デフォルトの名無しさん:2007/01/10(水) 16:07:31
当然らくだ
256デフォルトの名無しさん:2007/01/10(水) 16:18:38
PARのparl.exe
257デフォルトの名無しさん:2007/01/10(水) 16:25:41
258デフォルトの名無しさん:2007/01/10(水) 20:00:56
初めて書き込みさせて頂きました。

現在、perl(HPUX)とNet-Telnet-3.03を利用してtelnet接続しているのですが、
telnet中にESCキーを入力させる事は可能なのでしょうか?

perl:v5.8.0 built for PA-RISC1.1-thread-multi
telnet:Net-Telnet-3.03

対話式なプログラムを実行していき、途中で
どうしてもESCキーが必要になりました。

$telnet->print("\x1B");
こんな感じで文字コード入力でもダメでした。。
259韋駄天はふと考えた:2007/01/10(水) 23:02:23
あなた達も↓のような経験が一度や二度あるでしょう。私はわずか4年の間に
2回もパソコンをウイルスによって不調になり使えなくなりました。
私達はパソコン製造業者及び修理業者とパソコン関連で商売をしている業者を
あまりにも野放にしすぎました。
その結果が自作自演ウイルスバラ撒きの悪徳商法です。

703 :韋駄天はふと考えた :2007/01/10(水) 22:11:17 ID:ZKnpXOph
ノートンがウイルスを検出しました。
あなたのパソコンを60日間に渡り78250個ものウイルスから守ってきました。
もうすぐ無料期間が終わりますので、ウイルス対策有料ソフトを購入してください。

はぁ????なにいってんの?なんで、たった60日間で78250個ものウイルスが進入してくんだよ?
明らかに自作自演目的の業者の仕業じゃねえか?

犯人はおまえらだろが!この犯罪者かぶれの集団が!!

あちこちのサイトを開く度にコンピューターウイルスがパソコンにバンバン進入してくる。

おまえらな!自分で作ったサイトにコンピューターウイルスを混ぜて、他人の
何十万台ものパソコンを不調にさせたり故障させて、ウイルス対策ソフトを
高額で売りつけてまで儲けたいのかよ?

自転車屋が地域の自転車をパンクさせて回ったり、消防士が管轄地域で放火して
回るのと同じ犯罪をおまえらがやっているんだよ!

てめえらで新たなコンピューターウイルスを次々に作ってはバラ撒いては、ウイルス対策ソフトを
高値で売りつける自作自演商売しやがって!

この腐れ外道共が!    恥知らずの犯罪者共めが!
260デフォルトの名無しさん:2007/01/10(水) 23:06:09
>254
でっかく「PL」とか「Perl」の文字が入ってるアイコンとか……。(聞いてない)
261デフォルトの名無しさん:2007/01/11(木) 00:08:30
>>255
公式のらくだの絵をちょっと使って作ってみました。
>>256
あれはそのままでも結構かっこいいのですが、ちょっと抵抗があったので。。
>>260
一応Perlの文字を入れました。

どうもでした。
262デフォルトの名無しさん:2007/01/11(木) 01:01:46
ファイルを最終行から順にさかのぼって読む方法ないですか?
seek , getc等で1文字単位で読むしかないかな?
263デフォルトの名無しさん:2007/01/11(木) 01:09:57
>>262
つFile::ReadBackwards
264デフォルトの名無しさん:2007/01/11(木) 01:15:30
>>263
ありがとうございます。
265デフォルトの名無しさん:2007/01/11(木) 17:03:13
課題で
aを1文字の文字列、$bを数字とし、上の行から$aを$b回と表示していき、3角形を描くプログラム。
というのが出ています。

print "a? ";
chomp($a=<stdin>);
print "b? ";
chomp($b=<stdin>);

でaに+をいれ、bに5といれると

+
++
+++
++++
+++++

こんな感じで表示させたいです。
for文の入れ子でやると思うのですが、表記がわかりません。
ヒントだけでもいただけないでしょうか?
266デフォルトの名無しさん:2007/01/11(木) 17:09:13
bに1を足してaをb個並べてプリントしたら改行を繰り返す
267デフォルトの名無しさん:2007/01/11(木) 17:19:33
forの入れ子でやるとかいうと、もしかしたらこういう
おぞましいコードを期待してるかもしれないんだけど
for (my $line=1; $line <= $b; ++$line) {
for (my $num=1; $num <= $line; ++$num) {
print $a;
}
print "\n";
}

こういう風に簡潔にかける。
for my $num (1..$b) {
print $a x $num, "\n";
}
268デフォルトの名無しさん:2007/01/11(木) 17:21:58
あと $a と $b は sort とかで使われるから使うなといっとけ
269265:2007/01/11(木) 17:33:51
>>267
できました。ありがとうございます。
入れ子でわけわからない長いプログラムを作っていた自分がアホらしくなりましたw

もし入れ子でやるとしたら
入れ子の方の後半部分の
print $a;
}
print "\n";
}
はどういうことでしょうか?
270デフォルトの名無しさん:2007/01/11(木) 17:34:37
すぐ答え出す奴ってなんなの・・・
271デフォルトの名無しさん:2007/01/11(木) 17:54:51
漁師さん
272デフォルトの名無しさん:2007/01/11(木) 18:12:08
こういう場合は普通、for文を使わずにトリッキーなコードを書いてあげるのが
お決まりなんだけどね。
273デフォルトの名無しさん:2007/01/11(木) 18:21:32
print map { $a x $_ . "\n" } 1..$b;

274デフォルトの名無しさん:2007/01/11(木) 18:58:59
チューニングした答え書いて分かるかよ。
いっそのことCPANで(笑
275267:2007/01/11(木) 19:02:50
$a='+';$b=5;$t=0;
(${a}x(($b*$b+$b)/2))=~m{((??{++$t;".{$t}"}))(?{print"$^N\n"})}g;

こうですか?わかりません><
276デフォルトの名無しさん:2007/01/11(木) 19:17:38
$^Nなんて使ってるのはじめてみた(笑)
277デフォルトの名無しさん:2007/01/11(木) 19:26:01
(笑)なんて使ってるのはじめてみた(笑)
278デフォルトの名無しさん:2007/01/11(木) 20:25:30
確かにな(藁
279デフォルトの名無しさん:2007/01/11(木) 20:27:11
まぁ、ありえない
280デフォルトの名無しさん:2007/01/12(金) 02:12:36
print map "$_¥n", unpack +( join '', map "A${_}X${_}", 1..$b ), $a x $b ;
不毛だ…
281デフォルトの名無しさん:2007/01/12(金) 02:31:38
$_が半角文字"@"(0x40)を含むときのみデータを取得したいのですが、
以下のコードだと、$_が"病院"(0x95,0x61,0x89,0x40)とかの場合でも
データを取得してしまいます。
このような2バイト文字を取得しないようにするには
どの様に修正すればいいですか?

if ( $_ =~ "@" ) {
 $data[$i++] = $_;
}
282デフォルトの名無しさん:2007/01/12(金) 03:56:45
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz

CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。

具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。

渡されてきたURLを「http://www.xxx.com/index.php?%A5%AC%A5」のように、
そのまま表示するにはどうしたらいいでしょうか?

一応書いておくと、スクリプトはUTF-8Nで書いています。
283デフォルトの名無しさん:2007/01/12(金) 04:00:48
>1に全てが隠されているんじゃないだろうか。
284デフォルトの名無しさん:2007/01/12(金) 04:08:40
>>283
orz
CGIはスレ違いだったんですね。本当にごめんなさい。
一日考え続けてて疲れてたのか、>>1を確認するのを失念してました。
向こうの初心者質問スレで質問してくる事にします。
スレ汚し失礼しました。
285デフォルトの名無しさん:2007/01/12(金) 04:14:03
プログラム板から誘導されて来ました。
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz

CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。

具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。

渡されてきたURLを「http://www.xxx.com/index.php?%A5%AC%A5」のように、
そのまま表示するにはどうしたらいいでしょうか?

一応書いておくと、スクリプトはUTF-8Nで書いています。
286デフォルトの名無しさん:2007/01/12(金) 04:20:09
ぎゃー!!!
ありえない誤爆・・・。

ほんっとうにごめんなさい・・・。
287デフォルトの名無しさん:2007/01/12(金) 04:23:33
>1に全てが隠されているんじゃないだろうか。
288281:2007/01/12(金) 04:29:08
自己解決しました。
おさわがせしました。
289デフォルトの名無しさん:2007/01/13(土) 00:44:28
>>281見てて、ふと、半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
うーんうーん悩んでいた時のことを思い出した。
そういや、半角英字を全角英字に置換することってできるの?
290デフォルトの名無しさん:2007/01/13(土) 00:53:02
use utf8やるとか。
291デフォルトの名無しさん:2007/01/13(土) 01:42:35
EncodeもあるしUnicode::Japaneseもあるし。
292デフォルトの名無しさん:2007/01/13(土) 22:09:16
WebProg板に書いたけど、こっちの方がふさわしそうなので
こちらでお聞きします。

キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、
C言語でいうところの、getch() に相当する関数はないでしょうか?
293デフォルトの名無しさん:2007/01/13(土) 22:10:05
4年前ぐらいまでPG兼SEをしていたのだが、
そのころと比べるとかなりPerlは寂れた?
294デフォルトの名無しさん:2007/01/13(土) 22:34:22
>>292
Term::Getch
295デフォルトの名無しさん:2007/01/14(日) 00:42:13
こんな配列 @result=("E:15000", "S:20000", "W:15000", "N:50000")を作りまして
ここから、1位=N、2位=S、3位=E、4位=W、という結果を出したいと思っています。
得点が同点の場合、E→S→W→Nの順で優先となります。

とりあえず、$rank{E}='15000',$rank{S}='20000',,,として、
if(($rank{E}>=$rank{S})&&($rank{E}>=$rank{W})&&($rank{E}>=$rank{N})){
#E=1位
#SとWとNで2位以下の判別
  #何かと何かで3位と4位の判別
} elsif (($rank{S}>=$rank{W})&&.......
#S=1位
#EとWとNで2位以下の判別
  #何かと何かで3位と4位の判別
}elsif(..
と、やり始めましたが、とてつもない作業になりそうです。
何か、よい解決法がございましたらご示唆お願いします。

296デフォルトの名無しさん:2007/01/14(日) 00:49:18
普通にソートすりゃいいやん

@result= sort {(split/:/,$b)[1]<=>(split/:/,$a)[1]} @result;
297 ◆TWARamEjuA :2007/01/14(日) 01:04:42 BE:1633853-BRZ(6701)
とん・なん・しゃー・ぺー♪
298デフォルトの名無しさん:2007/01/14(日) 01:06:36
use strict;
# こんな配列
my @results = ("E:15000", "S:20000", "W:15000", "N:50000");

# 得点が同点の場合の順
my %prio_of = (
E => 0, S => 1, W => 2, N => 3,
);

my @s_results = map { $_->[0] }
sort { $b->[2] <=> $a->[2] || $prio_of{$a->[1]} <=> $prio_of{$b->[1]} }
map { [ $_, (split/:/=>$_)] } @results;
299デフォルトの名無しさん:2007/01/14(日) 01:23:07
数値として使う予定の変数を、文字列で宣言するのって確か非効率だよね。

随分長い間Perlから離れてるので間違ってるかも知れないけど
$foo = '2000';
と文字列にしておいて、その後で $foo を数値として使った場合、
スカラ変数の構造体は、
文字列型のものから、数値も文字列も両方入る奴に切り替わる。
構造体切り替えの手間もあるし、構造体のサイズも大きくなるから非効率

…だったような気がする。
300295:2007/01/14(日) 01:43:35
すばやいご提示、ありがとうございます。
>>296
すみません、説明が不足していました(ということに気づくのに、いただいた式を
眺めながらかなり時間がかかりました・・・)。実は、EやSが変数の中に出てくる
順番は毎回変わる可能性がありました。申し訳ありません。
>>298
欲しい結果が出せました。ただ、内容の理解には私にはまだまだ時間がかかりそうです・・
なんとか少しずつ、吟味していきたいと思います。
>>297
わかりましたか。そのとおりです。

皆様、すばらしいご教授、どうもありがとうございました。
301デフォルトの名無しさん:2007/01/14(日) 01:59:22
>>299
perl は型はなしでしょ。
$foo = '2000';

$foo = 2000;
は同じでしょ。
302デフォルトの名無しさん:2007/01/14(日) 02:13:38
>>301
つ [perlguts]
つ [Devel::Peek]
303デフォルトの名無しさん:2007/01/14(日) 02:45:43
>>302
もちっと教えてくれんかのう。
perldataには
「あるスカラー変数が、“文字列”型、“数値”型、“ファイルハンドル”型、
あるいはその他の型であるように宣言する方法はありません。」
とあるかんだけど、それとは違うレベルで何かあるのか?
304デフォルトの名無しさん:2007/01/14(日) 03:03:20
提示されている情報ぐらい見なさい。
> Double-Typed SVs
> スカラー変数は通常、整数、倍精度、ポインタ、リファレンスのうちの いずれか一つの型をとります。Perl は実際のデータに対して、
> 蓄積されている型から要求されている型へ、自動的に変換を行ないます。
305265:2007/01/14(日) 03:39:50
>>275 を提出したんですが、授業後
せんせから呼び出し受けました。
306303:2007/01/14(日) 03:57:55
>>304
どうもありがとう。
文脈によってperl内部で数値と評価されたり文字列として評価されたりすることは分かっています。
しかし、シンタックス上
$foo = '2000';

$foo = 2000;
に違いがあるとは読み取れませんでした。

#$foo = '2000' . '';
#と
#$foo = 2000 + 0;
#が違うのはわかりますよ。
307303:2007/01/14(日) 04:24:03
試してみれば良いんだね。
$foo = 2000;
の場合数値コンテキストになるんだ。(そりゃそうか)
308デフォルトの名無しさん:2007/01/14(日) 13:40:27
>>305
ワロタ
なんていわれたの?w
309デフォルトの名無しさん:2007/01/14(日) 14:38:20
先生が読めなかったか
先生がこのスレを見ていたか

どっちかな
310デフォルトの名無しさん:2007/01/14(日) 14:54:53
>>289
>半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
>うーんうーん悩んでいた時のことを思い出した。
>そういや、半角英字を全角英字に置換することってできるの?

次スレのテンプレ予定の>>115に忠実に従えば、
tr/a-zA-Z/a-zA-Z/
でできる。
311デフォルトの名無しさん:2007/01/14(日) 14:58:44
print "@{[1+1]}", "${\(1+1)}";

こういうテクニック(?)を思い出したんですけど、どこに書かれていたものでしょうか。
312デフォルトの名無しさん:2007/01/14(日) 15:01:00
>>306
use Devel::Peek;
$foo1 = '2000';
Dump $foo1;
$foo2 = 2000;
Dump $foo2;

SV = PV(0x363bc) at 0x18aef9c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x3dc2c "2000"\0
CUR = 4
LEN = 8
SV = IV(0x18a68b8) at 0x18af02c
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2000
313299:2007/01/14(日) 20:42:44
やっぱりPVIVになった。どうやら >>299 に書いた記憶通りだったみたい。

use Devel::Peek;
$foo = '2000';
Dump $foo;
$foo += 1;
Dump $foo;

SV = PV(0x1801660) at 0x180b5a8
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x300c70 "2000"¥0
CUR = 4
LEN = 5
SV = PVIV(0x1801a20) at 0x180b5a8
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2001
PV = 0x300c70 "2000"¥0
CUR = 4
LEN = 5

この状態でFLAGSをC側からいじると、
文字列として表示した時と、数値として使った時で別の値を出すスカラ
とか作れちゃうんだよね。
314デフォルトの名無しさん:2007/01/14(日) 22:35:50
>>313
実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。
ttp://search.cpan.org/~dconway/Contextual-Return-v0.1.0/lib/Contextual/Return.pm
use Contextual::Return;

$contextual = NUM { 10 } STR { 'abc' };
print $contextual . '';
print $contextual + 0;
315314:2007/01/14(日) 22:43:39
ああ、失敗。よく考えたら流石に代入は無理だな。…Tie使ったら或いは出来たりしそうな気もしないでもない。
313はスカラを作ると言うことで代入した別の値を保持まで出来たりするのかな
316デフォルトの名無しさん:2007/01/14(日) 23:55:02
Scalar::Utils の dualvar は?
317デフォルトの名無しさん:2007/01/14(日) 23:56:11
318デフォルトの名無しさん:2007/01/14(日) 23:59:37
>実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。
スルーしてた。xs を使って実現したのが Scalar::Util の dualvar ってことっすね。
319デフォルトの名無しさん:2007/01/15(月) 00:09:24
dualvar でスカラ作ってみたけど、
作った後で代入し直したら、片方だけ(数値だけ or 文字列だけ)になっちゃった。

ということは、xsでフラグいじって IOK, POK 両方立てても
代入したら片方になっちゃうということか。
オブジェクトにして代入まで見張れば良いんだろうけど。
320デフォルトの名無しさん:2007/01/15(月) 01:57:29
webサーバをan httpdからapacheに変更したところ文字化けする部分が出てきました。
method=getで受けとった部分が文字化けしてしまいます。method=postは大丈夫でした。
よろしくお願いします。
↓の一番下の部分も参考にしましたが直りませんでした。
http://tech.bayashi.net/pdmemo/chara2.html
apache perlは↓のサイトを参考に構築してあります。
http://www.y-kit.jp/saba/
------------------------------
環境
Apache/2.0.59 (Win32) PHP/5.1.4
------------------------------
コード例
require './jcode.pl';
#GET用
$myindata=$ENV{'QUERY_STRING'};
#POST用
#read( STDIN, $myindata, $ENV{ 'CONTENT_LENGTH' } );
#$myindata =~ tr/+/ /;
#$myindata =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge;
&jcode'convert( *value, 'sjis' );
print "Content-type: text/html\n\n";
print $myindata;
------------------------------
getデータ
http://localhost/bbsmt/write.cgi?name=a&mail=&message=あいうえお&a=11
表示データ
name=a&mail=&message=???¢???|?¨&ip=&a=11
321デフォルトの名無しさん:2007/01/15(月) 02:03:07
>1に全てが隠されているんじゃないだろうか。
322デフォルトの名無しさん:2007/01/15(月) 12:39:35
以前使っていたサーバでdbmファイルを使っていたのですが、
そのまま別のサーバに移動したら読み込めなくなりました。
dbmファイルは.dirと.pagの2つじゃない方(1つのファイル)です。
古いサーバはもう使えません。新しいサーバでdbmファイル
を読む方法はないでしょうか…。
323デフォルトの名無しさん:2007/01/15(月) 14:43:05
>>322
質問する時はまず環境を説明しろ!
(古い方と新しい方それぞれのOSの種類とバージョン,Perlのバージョン)

あと、読めなくなったってのはどんなエラーメッセージが来てるのかも報告汁
324デフォルトの名無しさん:2007/01/15(月) 19:18:22
>>322
ヒントになるかわからんが
NDBM_File
DB_File
GDBM_File
SDBM_File
ODBM_File
325320:2007/01/15(月) 20:46:35
別のとこで質問してきます。
326322:2007/01/15(月) 20:58:26
読めなかったと思ったら読めました。お騒がせしました。
dbmファイルはテキストなどに書き出しておかないとバイナリでサーバを移しても
読めないのだと思っていました。dbmopen()で読み書きしていたので、どの
形式のDBMかわからなかったのです。
327デフォルトの名無しさん:2007/01/16(火) 05:56:00
perlerのエロイ人教えて!ワッフルワッフル

指定されたディレクトリのディレクトリハンドルを開いて
ディレクトリ内のファイル名を取得するスクリプトを書いたのですが
名前が長いファイルがあるとそのファイルと、それ以降のエントリが
ディレクトリハンドルから取得できないんだけど
なんで?これどうすれば回避できる?

環境: Windows XP + ActivePerl5.8.8 build819
328デフォルトの名無しさん:2007/01/16(火) 07:04:48
esperのエロイ人が来て
お前の書いたスクリプトを透視した上で回答してくれるのを待つことだ
329327:2007/01/16(火) 10:55:47
>>328
再現スクリプトを下記に示します。
DirHandle以外にopendirでディレクトリハンドル開いたり、
globを使ってみたけど結果はおんなじでした。

----
#!/usr/local/bin/perl
use strict;
use utf8;
use warnings;
use FindBin;
use DirHandle;
use Data::Dumper;
my $dh = DirHandle->new($FindBin::Bin) or die $!;
my @entries = $dh->read;
print Dumper(\@entries);

__END__
----
330デフォルトの名無しさん:2007/01/16(火) 10:58:29
名前が長いファイルの例は何ですか?
331デフォルトの名無しさん:2007/01/16(火) 11:02:27
質問します。

foreach( sort(glob("*")) ){
if(-d){
@local_dir = (@local_dir,$_) ;
}elsif(-f){
@local_file = (@local_dir,$_) ;
}else{
print "Not Support Format -> $_\n" ;
}
}

ファイルとディレクトリに分けたいのですが、
ローカルだと上記のようにできますが、(他にスマートなやり方があるかもしれませんが。。)
ftp上のファイルを区別する方法はありますでしょうか。
以下ではどちらも同じファイルを取得してしまいます。

use Net::FTP;
my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
foreach( $ftp->ls("./") ){
print "$_\n" ;
}
foreach( $ftp->dir("./") ){
print "$_\n" ;
}
$ftp->quit;
332327:2007/01/16(火) 11:19:46
>>330
全角数字0から9を繰り返すのを160文字 + .txt
のファイル名を用意したら再現しました。
全角数字100文字の場合はファイル名が取得できました。
パスは
D:\test
で実験しました。
95系は絶対パスで255byte以下、
NT系は絶対パスで255文字以下と認識してるのですが
このへんの絡みですかね?
333327:2007/01/16(火) 11:26:39
>>331
Net::FTP::Fileにisfileとisdirってメソッドあるよ
インスコするかインスコできないならCPANでソース閲覧して参考にすればいけるのでは
334327:2007/01/16(火) 12:18:54
似たケースを見つけた。
ActivePerlのバグ?
http://www.namazu.org/ml/namazu-win32-users-ja/msg01954.html
335デフォルトの名無しさん:2007/01/16(火) 12:31:39
バグではなく仕様。
WinAPIでも使っとけ。
336331:2007/01/16(火) 13:23:32
>>333
出来ましたー。
最初ソース見て作ろうと思いましたが
面倒臭くなって結局インスコしましたw
ありがとうございます。
337327:2007/01/16(火) 13:44:46
>>336
もめでとう! こっちはいまだにはまり中 orz

>>335
バグじゃなくて仕様なの?
ちなみにWin32::APIを使ってみたけどなぜか取得できない。。。
338327:2007/01/16(火) 13:51:26
Win32::APIを使った再現スクリプト

----
#!/usr/local/bin/perl
use strict; use utf8; use warnings;
use Data::Dumper; use Encode; use File::Spec; use FindBin; use Win32::API;
Win32::API::Struct->typedef('FILETIME', qw(
DWORD dwLowDateTime; DWORD dwHighDateTime;)) or die $!;
Win32::API::Struct->typedef('WIN32_FIND_DATA', qw(
DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow;
DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[260];
TCHAR cAlternateFileName[14];)) or die $!;
my $FindFirstFile = Win32::API->new('kernel32', 'FindFirstFile', 'PS', 'N') or die $!;
my $FindNextFile = Win32::API->new('kernel32', 'FindNextFile', 'NS', 'I') or die $!;
my $FindClose = Win32::API->new('kernel32', 'FindClose', 'N', 'I') or die $!;
my $path = File::Spec->catdir($FindBin::Bin, '*');
my $FindData = Win32::API::Struct->new('WIN32_FIND_DATA') or die $!;
my $hFind = $FindFirstFile->Call($path, $FindData);
$hFind == -1 and die $!;
my @list = ($FindData->{cFileName});
push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData;
$FindClose->Call($hFind);
print Dumper(\@list);
__END__
339327:2007/01/16(火) 13:56:10
書込み時に改行多いって怒られたから改行を削ってたら
FindNextFileの閉じ括弧までまちがえて削っちゃった orz
>>338のソースは

×push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData;
○push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData);

でお願いします。 m(_ _)m
340デフォルトの名無しさん:2007/01/16(火) 13:56:31
この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。
この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、
パスの前に "\\?\" という接頭辞を追加してください。
詳細については、MSDN ライブラリの「File Name Conventions」(ファイル名の規則)を参照してください。
341327:2007/01/16(火) 14:45:03
>>340
どもです、自分もおんなじ情報に行き当たりました ;p
http://mag.autumn.org/Content.modf?id=20050930181032

Find(?:First|Next)FileじゃなくてFind(?:First|Next)FileWを使えってことなんですね。。。
ディレクトリのファイル一覧を取得する部分だけで苦労するな。。。
342デフォルトの名無しさん:2007/01/16(火) 14:51:49
>>327
http://msdn2.microsoft.com/en-us/library/aa365740.aspx
typedef struct _WIN32_FIND_DATA {
...
TCHAR cFileName[MAX_PATH];
343デフォルトの名無しさん:2007/01/16(火) 23:00:35
作ってもらった

    __
    |   |
    |   |   ___                  ___
    |   | .  /     |  __    _____   / _  \
    |   |  /  /|  |  /  /   / ____/  / /  >  l
    |   |. /  / .|  |. /  /   / /..   _    /   ̄  /
    |   |/  /  |  |/  /   /   ̄ ̄_/   /      \
    |       /.   |     /   / / ̄ ̄ __   /  / ̄ ̄>  |
    |    /   |___/  ./   ̄ ̄ ̄ /  /    ̄ ̄  /
     ̄ ̄ ̄             ̄ ̄ ̄ ̄ ̄     ̄ ̄ ̄ ̄ ̄     _____      ___ ___    ___
    ______                             /__  __/ [][] _| |_| |__ _| |_
     |  ___  \                               / /     |    _  | |_  レ'~ ̄|
     |  |    \  l                              |  |_      ̄|  | / / /   /| |
     |  |____/  /                             \__|      |  |  ̄ /_  /.  | |_
     |  ____/ ___  __    __/ヽ                    |_|.     |__|.   \/
     |  |     /`、_/_/ / _ ヽ  / _  /
     |  |     ヽ  /   | l   l l  | l   l l
     |  |       | l     ヽ  ̄ /  ,ヽ  ̄ /
      ̄          ̄      ̄ ̄  / __ ヽ
                        | l     l l
                        ヽ  ̄ ̄ /
                         ~ ̄ ̄~
344デフォルトの名無しさん:2007/01/16(火) 23:04:28
ちょっとでかいな
345327:2007/01/17(水) 01:05:42
ActivePerlではうまくいかないみたい。。。
http://aspn.activestate.com/ASPN/Mail/Message/libwin32-perl/2995279
346327:2007/01/17(水) 06:15:16
http://aspn.activestate.com/ASPN/Mail/Message/2996684
こちらのやり方で取得出来ました。

何度も自己レスすみませんでした m(_ _)m
347デフォルトの名無しさん:2007/01/17(水) 18:25:14
Perl 覚えたらこんなもの作れるようになりました。


 █   █   █      █          █▀▀▀▅
 ▀▅ ▅▀▅ ▅▀ ▅▅▅  █▅▅▅       █   █ ▅ ▅  ▅▅▅   ▅▅▅▅
  █ █ █ █ █▅▅▅█ █   █      █▀▀▀  █▀  █   █ █▅▅█
  ▀▅▀ ▀▅▀ █   ▅ █   █      █     █   █   █ █▅▅▅
   ▀   ▀   ▀▀▀  ▀▀▀▀       ▀     ▀    ▀▀▀  ▀▅▅▅▀

     ▅▅▅▅▅▅   ▅    ▅      █
 ▀▀▀▀ ▅▀  ▅   █ ▅▅▅█▅▅  ▀▀█▀▅▀▀▀▅
     █  █ ▀ ▀▀▀█      █  ▅█▀    █
     █         █   ▅▅▅▀ ▅▀█     █
     ▀▅         █       ▀ █     █ ▅
       ▀▀▀      ▀         ▀      ▀
348デフォルトの名無しさん:2007/01/17(水) 19:19:36
http://perldoc.jp/docs/perl/5.6.1/perlfaq5.podの
どうすればファイルハンドルをサブルーチンに局所化できますか?〜
の項目にあるサンプルコードの
local $_; # ← とても重要
の意味は一体なんでしょうか。
349デフォルトの名無しさん:2007/01/17(水) 19:31:19
sub owata {
  # local $_;
  $_ = "\(^o^)/";
}

$_ = "/(^o^)\";
owata;
print;


local $_; の行をコメントアウト/インして実行してみよう!
350デフォルトの名無しさん:2007/01/17(水) 19:48:51
ありがとうございます。でも余計にわからなくなったorz
実はこんなコード書いて試してみたんですがlocal $_;あっても無くても同じように動くんですよね

# lstはファイル名のリスト
open (FH, '< lst') or die;
while (<FH>) { print; &localtest }
close FH;

sub localtest
{
local *FH;
open (FH, $_) or die;
#local $_;
while (<FH>) { print }
}

何が違うのかも教えていただけたらうれしいです。
351デフォルトの名無しさん:2007/01/17(水) 19:58:12
$_はグローバルだから他で使われてるかもしれない。特に
左辺値でないもののaliasだったりすると値を書き換えることも
できないしな。

foreachのときは暗黙にlocalにしてくれるけど。
352デフォルトの名無しさん:2007/01/17(水) 21:12:34
>>350
localtest 呼び出しの後 $_ は書き換わってるけど、
すぐに次のループに入るので問題がないだけ。

while (<FH>) { print "begin: $_"; &localtest; print "end: $_" }

とかやってみると、違いがわかると思うよ。
353350:2007/01/17(水) 23:02:32
ありがとうございます。ようやく理解できました
しかし350のコードはアホですね…何をやっているんだか
この分じゃ他にもいろいろ勘違いしていることありそうで怖いです。
とりあえずほとんど理解せず使ってる型グロブをもうちょっと調べてみよう…
354デフォルトの名無しさん:2007/01/18(木) 00:01:12
間接的なファイルハンドル使おうよ
open my $fh, '<', 'filename' or die;
355デフォルトの名無しさん:2007/01/18(木) 02:29:27
FileHandleやIO::Fileって使わないの?
356331:2007/01/18(木) 09:36:42
331で質問したモノです。
また壁にぶち当たりました。
ftpしたあとのファイル、ディレクトリの日付、サイズを取得したいので調べてましたが
use Net::FTP::File;のNet::FTP::fstatは作りかけのようで使用出来ませんでした
$ftp->dir(./)で拾って日付を抜こうと思いましたが、日本語環境と英語環境で
表示が異なるので断念しました。
何か取得方法はないでしょうか。

use Net::FTP;
my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
357デフォルトの名無しさん:2007/01/18(木) 09:45:05
>>356
> 何か取得方法はないでしょうか。

マニュアルを見ると分かるんじゃないでしょうか
358デフォルトの名無しさん:2007/01/18(木) 12:07:32
Perlで文字列にunicodeが含まれているかどうかを判断するにはどうすればいいですか?
359デフォルトの名無しさん:2007/01/18(木) 12:20:56
「文字列にunicodeが含まれている」という言い方があいまい杉。

あるバイト列の文字コードがunicode由来のものであることを知りたいのか
(エンコーディングの仕方が何通りもあるので)

→ Encode::Guess。ただし完全な判定は無理。

UTF-8フラグが立った文字列であることを知りたいのか

→Encode::is_utf8(あるいはutf8::is_utf8)

それともぜんぜん別のことなのか
360デフォルトの名無しさん:2007/01/18(木) 12:45:35
>>359
unicode由来のもであるかどうかです
それと環境はPerl5.0でJcode.plです
361356:2007/01/18(木) 13:54:08
調べていたらNet::FTPのmdtmが使えそうだったので
書いてみましたがエラーが出ました。
使い方が間違えているのでしょうか。

$host = "***" ;
$user = "***" ;
$pass = "***" ;

use Net::FTP;
my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
foreach($ftp->ls()){
$aaa = $ftp->mdtm($_) ;
print "$aaa\n" ;
}
362デフォルトの名無しさん:2007/01/18(木) 16:20:51
>>361
Net::FTPの使い方としては間違ってないよ。
エラーってnot a plain fileのことか?
とりあえずエラーの理由知りたけりゃDebug=>1設定しなさい。
363デフォルトの名無しさん:2007/01/18(木) 16:24:58
>>360
jcode.pl は Unicodeには対応していないはず。
Perl 5.0 なんて時代遅れなもの使うのやめたら?
364デフォルトの名無しさん:2007/01/18(木) 16:29:49
時代は6だな
365361:2007/01/18(木) 16:36:17
---------------------------------------------------------------------------
#!/usr/local/bin/perl -w -- # -*-Perl-*-
use strict;
use warnings;
use Net::FTP;

my $host = "txfs02" ;
my $user = "g-fan" ;
my $pass = "fan" ;
my $aaa ;

my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
foreach($ftp->ls()){
$aaa = $ftp->mdtm($_) ;
print "$aaa\n" ;
}
---------------------------------------------------------------------------

↑これを実行すると一つのファイルにつき↓このメッセージが出ます。
色々試してはいますが詰まっていますorz

Use of uninitialized value in concatenation (.) or string at bbb.pl line 15.
366デフォルトの名無しさん:2007/01/18(木) 16:47:09
>>365
>Use of uninitialized value in concatenation ...
何も無いものをprintしようとしたからwarningsが出たわけ
print "$aaa\n";

print "$aaa\n" if $aaa;

367361:2007/01/18(木) 16:52:50
>>366
そうなんです。
全てのファイルのmdtmがundefになってるんですよね。
だいたい”foreach($ftp->ls()){”でファイルを拾っているので
ファイル名を間違えているとかそういうのは無いはずなんですが。
368デフォルトの名無しさん:2007/01/18(木) 17:03:16
Debug=>1にすると俺の環境では

ディレクトリはエラーでnot a plain fileを返してる(undef)
ファイルはtimeを返してる

369デフォルトの名無しさん:2007/01/18(木) 17:07:02
>>367
> ファイル名を間違えているとかそういうのは無いはずなんですが。

「はず」じゃなく確認しる。

とはいえ、手元で動かしてみたところ、同じエラーが出て失敗したり
成功したりする。なんじゃらほい。
370デフォルトの名無しさん:2007/01/18(木) 17:15:03
>>369
> とはいえ、手元で動かしてみたところ、同じエラーが出て失敗したり
> 成功したりする。なんじゃらほい。

急いで捕捉すると、テストに使った対象ftpサーバが、複数個をラウンドロビン
していたようた。要するに、ftpサーバソフトウェアによって成功したり
失敗したりしていたようだ。


371361:2007/01/18(木) 17:17:49
>>368
すみません。
Debug=>1の意味が理解できていませんでした。
今調べてDebug=>1で流したらこんなメッセージになっています。

Net::FTP=GLOB(0x15ecd4)>>> MDTM xxx.log
Net::FTP=GLOB(0x15ecd4)<<< 500 'MDTM xxx.log': command not understood.
Use of uninitialized value in concatenation (.) or string at bbb.pl line 16.

MDTMというコマンドがないみたいですが↓このファイル見たら_MDTMならあるけど
MDTMはありませんでした。
/usr/local/lib/perl5/5.8.6/Net/FTP.pm

>>369
調べましたがちゃんと見れていました。
372デフォルトの名無しさん:2007/01/18(木) 17:36:30
>>371
> Net::FTP=GLOB(0x15ecd4)>>> MDTM xxx.log
> Net::FTP=GLOB(0x15ecd4)<<< 500 'MDTM xxx.log': command not understood.
> Use of uninitialized value in concatenation (.) or string at bbb.pl line 16.

これはひどい(笑) MDTMコマンドが実装されていないのだろうか。

手元でやった例だと
失敗例
Net::FTP=GLOB(0x8212d38)>>> MDTM pub
Net::FTP=GLOB(0x8212d38)<<< 550 Could not get file modification time.

成功例
Net::FTP=GLOB(0x8212d38)>>> MDTM pub
Net::FTP=GLOB(0x8212d38)<<< 212 20060419172149

となります。
373デフォルトの名無しさん:2007/01/18(木) 17:45:44
今ぐぐってみたら
MDTMはFTPの拡張仕様だから対応してない鯖が多いみたいだ
MDTM対応してない鯖は気合でLISTの結果を解析するしかなさそうな感じ
374デフォルトの名無しさん:2007/01/18(木) 18:02:46
LISTのフォーマットもまちまちだから、本当に「気合」が必要だなw
375デフォルトの名無しさん:2007/01/18(木) 18:56:34
普通のftpクライアントはどうやってリスト作成しているんだろうね・・・

#暇なときにffftpのソース眺めてみよう
376デフォルトの名無しさん:2007/01/18(木) 19:01:19
IEもLISTを解析してるらしい
ttp://support.microsoft.com/kb/834577/ja
かなり大変そうだな・・・
377デフォルトの名無しさん:2007/01/18(木) 19:37:54
CPANを漁ったらこんなのがあった。使い物になるかな
ttp://search.cpan.org/~gaas/libwww-perl-5.805/lib/File/Listing.pm
378デフォルトの名無しさん:2007/01/18(木) 20:47:53
>>375
悲惨なものよ
379デフォルトの名無しさん:2007/01/19(金) 00:21:38
ファイル交換ソフトの利用履歴を調査するソフト「Winny特別調査員」
ttp://internet.watch.impress.co.jp/cda/news/2007/01/17/14478.html
>Winny特別調査員は、フォレンジック技術を応用した検査により、Winnyなどのファイル交換ソフトを利用した最終日時を調査するソフト。

これ、デモ版とはいえPerl(PAR)で書かれている珍しい製品
exeの拡張子をzipにして解凍すればソースを取り出すことが可能。


このソースを見てフォレンジック技術と"売り物"のクォリティを感じろ、おまいら
380デフォルトの名無しさん:2007/01/19(金) 00:33:42
>>379
@KINTAMA_STRとかあってワロス
381361:2007/01/19(金) 09:54:34
>>373
拡張なんですね。。
>>372->>380
$ftp->dir("./")で取得するとサーバによってこんな風になるんですよね。
表示が英語か日本語だけならまだ対応出来るんですが
日本語で去年のファイルになると時間が年表記になって
時間が取り出せないorz

drwxrwxr-x 2 user group 1024 Dec 5 00:03 dir_name

drwxr-xr-x 5 user group 512 3月 29日 2006年 dir_name

何か他に日付とサイズ取得できるのないかな。
382デフォルトの名無しさん:2007/01/19(金) 10:18:31
>>381
> 日本語で去年のファイルになると時間が年表記になって
> 時間が取り出せないorz

いや、UNIXのlsコマンドの詳細表示は、半年以上過ぎるとそういう表示になる
仕様だというだけ。それを反映しているのでしょう。英語でもそうなるはず。
っていうか、そうなるのがある、か。
383デフォルトの名無しさん:2007/01/19(金) 13:16:05
>>379
これぐらいの物ならPerlで作らなかった方が良かったのにね。。
コメントとテストコードが残っている事以外に関して言えば
別に酷いコードじゃないと思うけど、フォレンジック技術について言えば;;
文字連結が好きだって事は分かった。
384デフォルトの名無しさん:2007/01/19(金) 14:01:44
> 別に酷いコードじゃないと思うけど、
マジで?
385デフォルトの名無しさん:2007/01/19(金) 14:07:39
112 :番組の途中ですが名無しです [sage] :2007/01/17(水) 15:23:40 ID:p3fP2iOG0
sub pf_check_p2p{
if ($_[0]=~/winny\.exe/i){add_ctime($_[0],$WINNY,"WINNY");}
if ($_[0]=~/winnyp\.exe/i){add_ctime($_[0],$WINNYP,"WINNYP");}
if ($_[0]=~/Share\.exe/i){add_ctime($_[0],$SHARE,"SHARE");}
if ($_[0]=~/PERFECT DARK\.EXE/i){add_ctime($_[0],$PD,"PD");}
if ($_[0]=~/cabos\.exe/i){add_ctime($_[0],$CABOS,"CABOS");}
if ($_[0]=~/limewire\.exe/i){add_ctime($_[0],$LIMEWIRE,"LIMEWIRE");}
if ($_[0]=~/BITTORRENT\.EXE/i){add_ctime($_[0],$BIT,"BIT");}
if ($_[0]=~/BITCOMET\.EXE/i){add_ctime($_[0],$BIT,"BIT");}
}

(;^ω^)


139 :番組の途中ですが名無しです [sage] :2007/01/17(水) 15:35:19 ID:p3fP2iOG0
なんか製品版も同じな気がする…
だってp2ptest.plの30行辺り見ると…

my $kin="\x5b\x90\x6d\x8b\x60\x82\xc8\x82\xab\x83\x4c\x83\x93\x83\x5e\x83\x7d\x5d";

ついでにこれってShift_JISで見ると [仁義なきキンタマ] なんだよね
386383:2007/01/19(金) 14:20:43
>>384
苦なく読めるという点で。改良点を挙げようとすればそりゃ出てくるがな。
387デフォルトの名無しさん:2007/01/19(金) 15:04:42
>>385
これだけ見ても何が面白いのかワカランだろ。まぁ、十分ヘタクソなコードだけど。
これが商用のソフトのファイル共有ソフトの検出処理だってのが凄い。
http://72.14.253.104/search?q=cache:82TAp8C1ZsUJ:news20.2ch.net/test/read.cgi/news/1169012146/+pf_check_p2p&hl=ja&ie=UTF-8
388デフォルトの名無しさん:2007/01/19(金) 15:15:48
Prefetchに気づいてる香具師が一人しかいないそのスレも大分痛い
389デフォルトの名無しさん:2007/01/19(金) 15:37:59
>>388
ニュー速だぞ?w
390デフォルトの名無しさん:2007/01/19(金) 16:29:43
>>379
調査員が、PC操作してる俺の隣に座って
監視するわけじゃないのか。 じゃイラネ。
391デフォルトの名無しさん:2007/01/19(金) 16:41:48
人件費が馬鹿にならんだろそれじゃ
392デフォルトの名無しさん:2007/01/19(金) 17:08:45
マwジwレwwスwww
393デフォルトの名無しさん:2007/01/19(金) 17:12:31
391に突っ込むって
どんだけ2ch初心者なんだよ
394デフォルトの名無しさん:2007/01/19(金) 17:19:27
2chw初w心ww者www
395デフォルトの名無しさん:2007/01/19(金) 17:56:46
はいはい
vipに帰りな
396デフォルトの名無しさん:2007/01/19(金) 18:00:16
はwいwwはwwwいwwwww
いい加減自演疲れただろうパトラッシュ
397デフォルトの名無しさん:2007/01/19(金) 19:04:24
>>393
熟練の方ですか?wwww
398デフォルトの名無しさん:2007/01/19(金) 19:05:06
          ばばばばばばっ
    w      w  _  _   w   w
        w   ヽ(・ω・)ノ   w    w
         w .(( ノ(  )ヽ )) w
wwwwwwwww..............┛┗...........wwwwwwwww
399デフォルトの名無しさん:2007/01/19(金) 20:11:44
言い負けてからが長い
400デフォルトの名無しさん:2007/01/20(土) 00:53:18
2chViewer ●にログインして、過去ログをひたすら(ウェイトは挟みつつ)取得するスクリプトを書いたのですが、
●ログインは出来るものの、肝心の過去ログが取得できません。gzip圧縮された「-ERR もう つかえません」と言うメッセージが取得されるだけです。
●アカウントそのものは既成の専用ブラウザ(OpenJane 0.1.12.6b)で生きていることを確認しています。
コーディングの問題なのか、2chの●過去ログ取得の仕様にあっていないための不都合なのか、自分では切り分けが出来ませんでした。

ソースはこれです。 http://sub.jetabbs.org/upload2/upload/upz043.zip (コメント・メッセージがキモくてごめんなさい)
スレ違いでしたら誘導をお願いします。
401デフォルトの名無しさん:2007/01/20(土) 15:39:22
>>400
ソースは読んでいないけど、
それって、Perlの問題というより、2ちゃんねるの認証の問題だね。
専用ブラウザ以外のソフトで過去ログを取得しようとすると、拒否する
ように設定していると聞いた覚えがある。
あとは、こちらのスレで聞いたほうがいいよ ↓

monazilla Part 5
http://pc10.2ch.net/test/read.cgi/tech/1057329161/l50
402デフォルトの名無しさん:2007/01/20(土) 15:51:03
専用ブラウザでのやりとりをキャプチャして同じリクエスト投げるようにすればいいんじゃね?
暗号化されてたらシラネ
403401:2007/01/20(土) 15:51:23
>>400
あと、Snifferというソフトを使って、専用ブラウザが出しているIPパケットと、
自作のスクリプトが出しているIPパケットとを比べれば解決するかもしれないよ。
404デフォルトの名無しさん:2007/01/20(土) 22:02:59

use threads;
use threads::shared;

# 終了の合図
my $kill:shared = 0;

# スレッド作成
my $thread = threads->new(\&loop);

処理...

$kill = 1;
$thread->join;

sub loop {
  while (!$kill) {

    処理...

    sleep(60);
  }
}

少し長くてすみません…。
マルチスレッドでwaitを挟みつつ処理を行い
任意のタイミングで終了させるプログラムを組んでいるのですが、
このコードだと終了用の変数をセットしてから処理が戻るまで60秒もかかってしまいます。
何かいい方法はないでしょうか
よろしくお願いします。
405デフォルトの名無しさん:2007/01/20(土) 22:24:10
>>400
UAをMonazilla/1.00にするとか
406デフォルトの名無しさん:2007/01/20(土) 22:47:00
>>404
threads::sharedにcond_ナントカというのがいくつかあるので
よく説明読め。たぶんお前が求めているものはそれだ。
407デフォルトの名無しさん:2007/01/20(土) 22:55:23
>>406
ありがとうございます
調べてみます
408デフォルトの名無しさん:2007/01/20(土) 23:33:03
Perl Hacks
ttp://www.amazon.co.jp/dp/4873113148/

これ今日発売だけど買った奴居る?
中身どうですか?
409デフォルトの名無しさん:2007/01/20(土) 23:57:59
そんな本が出るこそさえ知らなかったわさ
410デフォルトの名無しさん:2007/01/21(日) 00:14:29
>>406
cond_timedwait
cond_signal
を併用する事でできました
昨日からずっと悩んでいたので助かりました
ありがとうございました
411デフォルトの名無しさん:2007/01/21(日) 00:19:55
>408
O'Reillyで目次見れるから、だいたい判断つくんじゃない?
俺は英語版持ってるから買わないけど。
ttp://www.oreilly.co.jp/books/9784873113142/toc.html
412デフォルトの名無しさん:2007/01/21(日) 00:54:41
第1章の1項ってテクニック?
413デフォルトの名無しさん:2007/01/21(日) 01:23:23
1章2章はツールの話だろ
414デフォルトの名無しさん:2007/01/21(日) 01:24:15
「firefoxから簡単にCPAN検索できるようにする」だからテクニックといえばテクニックだろ。
俺はsleipnirもfirefoxもCPAN検索できるようにしてある。
あとはローカルにppmリポジトリを立てればすごく便利。
415デフォルトの名無しさん:2007/01/21(日) 05:57:20
>>408
買った買った。ペラペラとめくってからほぼ衝動買い。
お前も買え。
416デフォルトの名無しさん:2007/01/21(日) 12:10:31
すみません

@week = ("Sun","Mon","Tue","Wed","Thr","Fri","Sat");
$i = 0;

for($i=0; $i <= 7; $i++){
print $week[${i}];
}

このソースで-wオプション付けて実行すると
Use of uninitialized value in print at ./hairetu.pl line 7.
と警告が出るのですが何故でしょうか?
見たところ変数はきちんと初期化していると思うのです。
417デフォルトの名無しさん:2007/01/21(日) 12:12:55
わかりました
7じゃなくて6ですた…
自己解決染ました
418デフォルトの名無しさん:2007/01/21(日) 12:41:03
>>417
> 7じゃなくて6ですた…

植木算のミスといいます。そして Perl では「必要がなければ添え字を扱わない」ことで、このリスクを回避できます。

foreach my $wday (@week) {
    print $wday;
}

あるいは、

print for @week;
419デフォルトの名無しさん:2007/01/21(日) 13:30:56
すごい省略できるんですね…
420デフォルトの名無しさん:2007/01/21(日) 16:25:18
Perlの省略記法は、芸術ですから。
いろいろ言われるところもあるけど、ラリー・ウォール先生もPGは傲慢であれとおっしゃっていることだし。
うん。大丈夫。半年前に書いたスクリプトがさっぱり分からなくても大丈夫。泣くことなんて無いよ。
421デフォルトの名無しさん:2007/01/21(日) 16:39:35
> foreach my $wday (@week) {
> print $wday;
> }

"my" なんて入れる必要ないだろ
422デフォルトの名無しさん:2007/01/21(日) 16:45:32
PBP6.9に入れた方がいいと書いてあるだろ
423デフォルトの名無しさん:2007/01/21(日) 18:36:44
自分のフォルダのtextファイル(1000行〜1500行)を

ひとつの変数に入れる方法を教えてください


open(IN,"< foo.txt");
foreach(IN){ ・・・
}

のように一行づつ処理ではなく、全部の行をまとめて処理したいのです。
(正規表現で複数の行に渡って処理したいため)

何かいい方法はないでしょうか?
よろしくお願いします
424デフォルトの名無しさん:2007/01/21(日) 18:40:53
read関数
425デフォルトの名無しさん:2007/01/21(日) 18:47:46
my $txt = join('', (<IN>)[999 .. 1499]);
426423:2007/01/21(日) 18:49:16
>>424
>>425
ありがとうございます。
無事解決できました
427デフォルトの名無しさん:2007/01/21(日) 19:00:13
いいのかおい
428デフォルトの名無しさん:2007/01/22(月) 23:22:29
正規表現の量指定子{}に変数は使えますか?
429デフォルトの名無しさん:2007/01/22(月) 23:25:53
すいません、自己解決しました
てか自分で試せばよかった・・・
430デフォルトの名無しさん:2007/01/23(火) 17:27:38
すみません。
教えてください。

my @aaa = () ;
my @bbb = () ;
for(my $i=0;$i<5;$i++) {
@aaa = ($i,$i+1) ;
@bbb = (@bbb,\@aaa) ;
}
foreach(@bbb){
print "$_\n" ;
}
foreach(@bbb){
foreach(@$_){
print "$_\n" ;
}
}

上を実行すると下の結果になります。

ARRAY(0x13c93c)
ARRAY(0x13c93c)
ARRAY(0x13c93c)
ARRAY(0x13c93c)
ARRAY(0x13c93c)
4 5
4 5
4 5
4 5
4 5

>>↓に続く
431430:2007/01/23(火) 17:28:11
>>↑の続き

出力させたい結果は以下なのですがどうも
リファレンスの中がARRAY(0x13c93c)で全て同じになってしまっているようです。
(同じ@aaaという配列名をリファレンスしているせい?)
ループさせてリファレンスを増やしていきたいのですが
どのようにしたら下記のような出力結果に出来ますでしょうか。

0 1
1 2
2 3
3 4
4 5
432デフォルトの名無しさん:2007/01/23(火) 17:40:06
レキシカルスコープ
433デフォルトの名無しさん:2007/01/23(火) 17:41:40
>>430-431
ループのなかでmyするようにする。
my @aaa = ($i,$i+1) ;

若しくは無名配列のコンストラクタを使う。
@bbb = (@bbb,[@aaa]) ;

ループの外では@aaaを使っていないのだから、
スコープをループ内に縛る前者をお勧めする。
434デフォルトの名無しさん:2007/01/23(火) 17:48:50
質問です。

テキストファイルから顔文字を除去しようと考えていますが、いい方法がみつかりません。
正規表現でうまく除去する方法というのはないでしょうか?


現在考えていますのが、括弧の中に記号あると顔文字であると判断するとしています(例=(゜Д゜) (ノ∀`*) など。
この正規表現を書く場合全ての記号を書かないといけないでしょうか?

質問が2つとなりましたが、よろしくお願いします
435デフォルトの名無しさん:2007/01/23(火) 17:52:37
>>434
まず正規表現を勉強しろ。

顔文字のリスト作ってそれと比較するのが単純で速いと思うが。
436デフォルトの名無しさん:2007/01/23(火) 17:55:52
(゜o゜)これはおk?
(TへT)これもおkだね
437434:2007/01/23(火) 17:57:28
>>435
リスト作ったほうが早いですか。

その場合、リストにない顔文字は一致しませんけど、しょうがないか…
全部の顔文字をうまく除去するなんて、難しいですよね
438デフォルトの名無しさん:2007/01/23(火) 18:01:19
上手く作ったとしても
 テンプレート・ツールキット(TT)
なんて文脈じゃ誤判定は避けられないな
439デフォルトの名無しさん:2007/01/23(火) 18:04:54
>>437
"ヽ(`Д´)ノ"
とかが、"ヽノ"になってもいいのかってこったわな。
結局は、顔文字の辞書ファイルを保守するしかないだろ。
440434:2007/01/23(火) 18:18:05
"ヽ(`Д´)ノ"の場合は前後が記号ならそれも弾くとか考えてたんですよね

まぁ、ノのほうが記号じゃないんで、残りますが。

顔文字の辞書作ってるけど。結構メンドクセ
441430:2007/01/23(火) 18:21:54
>>433
解決しました。
ありがとうございました。

>>432
こういうのをレキシカルスコープって言うんですね。
ありがとうございます。
442デフォルトの名無しさん:2007/01/24(水) 01:40:36
文字の置換の際に、「マッチした文字列になんらかの処理をする」ということは可能でしょうか?

$str = "ABCDEF";
$str =~ s/(B)/&conv($1)/;

のように、マッチした文字列を、関数を使って、返り値で置換したいのですが・・・
(ちなみの、このコードだと、
A&conv(B)CDEF
という文字列になってしまいました。。。)
443デフォルトの名無しさん:2007/01/24(水) 02:25:10
e
444デフォルトの名無しさん:2007/01/24(水) 04:16:24
v
445デフォルトの名無しさん:2007/01/24(水) 06:30:30
>>442
Windowsならコマンドプロンプト開いて
perldoc perlre
でperlの正規表現のドキュメント読めるよ。
ドキュメントにざっと目を通してれば人に質問するような内容じゃないぞ。
4464442:2007/01/24(水) 07:16:24
>443
>445
ありがとうございます。 /e で、できました。

ドキュメントを確認せずに質問してしまって
済みませんでした。
プログラミングPerlにも、 /e が載ってました・・・
447デフォルトの名無しさん:2007/01/24(水) 14:10:56
CGI作るつもりでperl始めたんだけど、テンプレにあるようなCGIとは無関係な使い方ってどんな使い方するの?
例えばどんな仕事でどう使うとか教えてほしい
448デフォルトの名無しさん:2007/01/24(水) 14:14:36
>>447
スクリプトとして使えるじゃん。 バッチ処理とかさ。
449デフォルトの名無しさん:2007/01/24(水) 14:26:58
>>447
CGIと関係なく、データベースとのやりとりとか。
450デフォルトの名無しさん:2007/01/24(水) 14:27:35
>>447
えーと、えーと
451デフォルトの名無しさん:2007/01/24(水) 14:29:52
こんな質問するやつに教えても理解できないと思うよ
452デフォルトの名無しさん:2007/01/24(水) 14:31:22
エロ画像エロ動画収集に決まってるだろ
453デフォルトの名無しさん:2007/01/24(水) 14:32:40
分類したエロ画像ファイルをリネームする
454デフォルトの名無しさん:2007/01/24(水) 15:02:24
CUIだから単純で且つ面倒くさい処理やらせてる。すぐ書けるしね
>>452
漏れ以外にPerlをエロ収集に使おうと考える奴がいるとは・・・
455デフォルトの名無しさん:2007/01/24(水) 16:01:07
>452-454
あれ、俺が何人もいる…
456デフォルトの名無しさん:2007/01/24(水) 17:03:32
たしかにエロ収集に便利、というよりエロ収集してる時が一番はかどるな。
457デフォルトの名無しさん:2007/01/24(水) 17:06:36
組みたくなってきた・・・
エロパワーは絶大だな
458デフォルトの名無しさん:2007/01/24(水) 17:31:07
 ▀▄    ▀▄      ▄█    ▄█  ▀▀▀▀█
   ▀▄    ▀▄   ▄▀█   ▄▀█     ▄▀
    ▄▀    ▄▀ ▄▀ █  ▄▀ █     █
  ▄▀    ▄▀   ▀▀▀█▀ ▀▀▀█▀   █
 ▀     ▀        ▀     ▀    ▀

   █ ▄▄▄   █    ▀▀▀▀    ▄      ▄█ █
  █  █▄▄ █ █  ▄▄▄▄▄▄▄   █  ▄▄▄▄█▄▄
 ▀█ ▄█ █ █ █      ▄▀    █      █
  █ ▀ █▀ █ █    ▄▀▀▄    █   ▄▄▄█
  █  ▄▀    █  ▄▀   █    █  █   █▀▄
  ▀  ▀    ▀▀ ▀      ▀▀▀ ▀   ▀▀▀

こんなスレアラシに使える。
459デフォルトの名無しさん:2007/01/24(水) 18:27:19
正規表現が使いやすいからPerlで組んだ
でもCUIなのがなぁ
460デフォルトの名無しさん:2007/01/24(水) 18:34:47
Perlでは、ワンライナーか数行程度のスクリプトでテキストをいじったりとか
しかしてないが
Unicode対応がボミョウなので、たまに困ったことになる

use encoding('cp932')とかって、-n/-pスイッチとかと一緒に使うと
うまく動かなくね?つか、これって基本的に非推奨なんだべ?

Unicode文字列のリテラルや正規表現を直接記述できないので、
use encoding()しないとなると途端にウザい事態になるわPerlは
461デフォルトの名無しさん:2007/01/24(水) 18:39:55
スクリプトをutf8で書けばuse encodingいらないし特に問題ないけどね。
462460:2007/01/24(水) 18:43:07
>>461
それはスクリプトも入力もUTF-8を仮定できるときだけだべ?
少なくともWindows環境でそれは仮定できないなぁ
UTF-8なファイル名でファイル開いたりできないし
463デフォルトの名無しさん:2007/01/24(水) 19:11:42
464デフォルトの名無しさん:2007/01/24(水) 21:44:41
465460:2007/01/24(水) 23:34:35
>>463
-pスイッチや-nスイッチを使わない場合はそれで上手く行くようです。
そもそも毎度毎度こんなに長いのではワンライナーは書けませんし、
簡単な仕事を簡単にやっつけられないのなら、Perlとしての魅力は
激減ですが。

やっつけ仕事によく使う-pスイッチや-nスイッチと
use utf8を共存させる方法はありますか。
#!/usr/bin/perl -pi.bak
なスクリプトで>>115の方法を試すと全くおかしなことになります。

>>464
なるほど、便利なモジュールがあるのですね。
466デフォルトの名無しさん:2007/01/25(木) 00:31:18
間違いなく合ってない。
煽りとかではなく。
別の言語にしたほうが幸せになれるとおもうよ。
467デフォルトの名無しさん:2007/01/25(木) 01:21:17
Perl/Tk で GUI でエロ画像を集めてるよ。
468デフォルトの名無しさん:2007/01/25(木) 02:46:48
エロのエネルギーはおよそ12kW/hです。
469デフォルトの名無しさん:2007/01/25(木) 09:55:07
質問
use strict; warn $c;
だとstrictが効くのに
use strict; warn $a;
だとstrictが効かないのはなぜ?
$bも効かない
470デフォルトの名無しさん:2007/01/25(木) 10:04:09
sort() で使われるから例外扱い
perlvar嫁
471デフォルトの名無しさん:2007/01/25(木) 10:16:32
質問します。

for(my $i=0;$i<=$#aaa;$i++){
$out = $aaa[$i] ;
if( $aaa[$i+1] ){
while($aaa[$i+1] =~ /^\+/){
$i++ ;
$out = "$out $aaa[$i]" ;
}
}
print "$out\n" ;
}

これのforをforeachで書いたらどんな記述でかけますでしょうか。
やりたいことは、ある要素のアタマに"+"があれば
その要素は一つ前の要素とつなげようとしています。
foreachで回している最中に強制的に次の要素にアクセスすることは出来るのでしょうか。
472デフォルトの名無しさん:2007/01/25(木) 10:18:14
from>>469 to>>470

perldoc perlvar
$a
$b Special package variables when using sort(), see "sort" in perlfunc. Because of this specialness $a and $b don’t need to
be declared (using use vars, or our()) even when using the "strict ’vars’" pragma. Don’t lexicalize them with "my $a" or
"my $b" if you want to be able to use them in the sort() comparison block or function.

thx!
473デフォルトの名無しさん:2007/01/25(木) 10:27:06
>>foreachで回している最中に強制的に次の要素にアクセスすることは出来るのでしょうか。

foreachでは今アクセスしている要素が何番目かを知ることはできない。
もちろん、中で別に変数を$i++とかすりゃ別。

俺ならこんな感じに書く。

foreach (@aaa) {
if (/^\+/) {
$out[-1] .= " $_";
} else {
push @out, $_;
}
}
474デフォルトの名無しさん:2007/01/25(木) 10:34:48
すまん、なぜかソラ目でprintがpushに見えていた。

printだとこうかな。printが2つあるのがいまいち気に入らないが...

my $buf = undef;
foreach (@aaa) {
if (/^\+/) {
$buf .= " $_";
} else {
print $buf, "\n" if defined $buf;
$buf = $_;
}
}
print $buf, "\n" if defined $buf;
475デフォルトの名無しさん:2007/01/25(木) 10:38:17
>>473 の後
print map { "$_\n" } @out; でもすりゃいいんだから別にいいんじゃ
476デフォルトの名無しさん:2007/01/25(木) 15:20:56
print "$_\n" for @out;
このほうが短い。
477デフォルトの名無しさん:2007/01/25(木) 15:30:03
print join "\n", @out;
の方がわかり安い
478デフォルトの名無しさん:2007/01/25(木) 15:49:57
どれが速いんですかね^^
479デフォルトの名無しさん:2007/01/25(木) 16:05:03
>>477
ダウト。それだと最後の要素の後に改行が出ない。
480471:2007/01/25(木) 16:31:27
>>473
できました!!
すっきりしてわかりやすくなりました。
ありがとうございます。
481デフォルトの名無しさん:2007/01/25(木) 16:40:25
>>479
そういう細かい部分ってすっごい大事だよね
後で泣き見たりする
しかし「ダウト」って使う人はあんまり見たことが無い
482デフォルトの名無しさん:2007/01/25(木) 18:24:14
クイズのゲームを作っているのですが、問題を回答したら次ってどんどん進んでいき
正解したら各問ごとに正解数をカウントしていってりうのですちゃんとカウントされません。

perlはテキストでも作ってそれに書き込んでそのあと読み込んでしないと記憶した
変数が消えるのですか・・・?
変な質問ですみません。HSPからperlに乗り換えてみたんですが混乱してしまって
483デフォルトの名無しさん:2007/01/25(木) 18:28:08
>>482
日本語でおk
HSPで作ったほうがいいんじゃね?
484デフォルトの名無しさん:2007/01/25(木) 18:30:01
>>483
perlの勉強をしてみたいと思いましたので・・・

myで定義をしてるんですけど、なんかいろいろと定義の仕方があるみたいですねperlは
485デフォルトの名無しさん:2007/01/25(木) 18:32:17
さっさとソースを見せろ
486デフォルトの名無しさん:2007/01/25(木) 18:45:37
if($tugi eq "Q1"){
if($toi eq "t"){
$sum=$seikai+1;
}
&mon0;
}
if($tugi eq "Q2"){
if($toi eq "t"){
$sum=$seikai+1;
}
&mon1;
}
if($tugi eq "Q3"){
if($toi eq "t"){
$sum=$seikai+1;
}
&goukei;
}

sub goukei{
print "正解は"+$sum+"個";
}
487デフォルトの名無しさん:2007/01/25(木) 18:45:40
次の問題へ進むたびに正解数を my してるんだろうな
488デフォルトの名無しさん:2007/01/25(木) 18:47:08

sub mon0{
print "<P>";
print "<SELECT name='answer' size='3'>";
print "<OPTION value='true'>みかん</OPTION>";
print "<OPTION value='false'>アップル</OPTION>";
print "<OPTION value='false'>ばなな</OPTION>";
print "</SELECT>";
print "</P>";
print "<INPUT type=hidden name=tugi value=Q2>";
print "<P><INPUT type='submit' value='次の問いへ'></P>";
}
sub mon0{
print "<P>";
print "<SELECT name='answer' size='3'>";
print "<OPTION value='false'>インコ</OPTION>";
print "<OPTION value='true'>ふくろう</OPTION>";
print "<OPTION value='false'>鳩</OPTION>";
print "</SELECT>";
print "</P>";
print "<INPUT type=hidden name=tugi value=Q3>";
print "<P><INPUT type='submit' value='次の問いへ'></P>";
}

こんな感じです
489デフォルトの名無しさん:2007/01/25(木) 18:48:04
webprogでやれ
490487:2007/01/25(木) 18:49:27
はずした。

> $sum=$seikai+1;
491デフォルトの名無しさん:2007/01/25(木) 18:49:59
$sum=$sum+1
じゃないの?
492デフォルトの名無しさん:2007/01/25(木) 18:53:22
>>491
そこは修正しました。
上のほうで
my $sum;
と定義してるのが問題なんでしょうか?
493デフォルトの名無しさん:2007/01/25(木) 18:57:38
上のほうで、とか言われてもわからないから全部見せろ
494デフォルトの名無しさん:2007/01/25(木) 18:58:39
そもそもCUIなのかCGIなのか
495デフォルトの名無しさん:2007/01/25(木) 18:59:02
↓こっちのがいいんでね?
http://pc10.2ch.net/test/read.cgi/php/1164519503/
496デフォルトの名無しさん:2007/01/25(木) 19:08:30
ttp://www.vipper.net/vip166431.zip.html
ここに書き込むと長いのでアップしてきました
497デフォルトの名無しさん:2007/01/25(木) 19:19:26
htmlなんだろw
498デフォルトの名無しさん:2007/01/25(木) 19:22:30
板違いっぽいですね(−−
499デフォルトの名無しさん:2007/01/26(金) 05:44:42
>>477 は最後の改行もそうだが、メモリ内で一旦展開するから、
効率よくないんでない?
500デフォルトの名無しさん:2007/01/26(金) 07:40:35
さらに、文字列を連結するためにメモリの再割り当てが何度も起きる悪寒
501デフォルトの名無しさん:2007/01/26(金) 11:44:01
UTF8 で並んでいる名前の一覧があるのですが、それをあいうえお別に分類したいのですが
どういう方法が良いでしょうか。

青木 -> @AGyou へ
斉藤 -> @SaGyou へ
という感じにしたいとおもいます。
502デフォルトの名無しさん:2007/01/26(金) 12:04:33
読み仮名付けなきゃ無理だね
503デフォルトの名無しさん:2007/01/26(金) 12:07:36
>>502
お返事ありがとうございます。やっぱり難しいですね orz
別の手段を考えて見ます。
504デフォルトの名無しさん:2007/01/26(金) 12:10:01
>>503
> 別の手段を考えて見ます。

なんで? 読みがなつければいいじゃん。
505デフォルトの名無しさん:2007/01/26(金) 12:13:15
>>504
表現が悪くてすいません。別の手段 → 読み仮名をつけることです。
506デフォルトの名無しさん:2007/01/26(金) 12:32:13
読みがなをつけるモジュールって、あっても良さそうなもんだけどね。
mecabにぶっ込めば一発か?
507デフォルトの名無しさん:2007/01/26(金) 12:35:47
>>506
あ〜それ欲しいですね。
508デフォルトの名無しさん:2007/01/26(金) 13:24:24
不確実すぎるだろ・・・
509デフォルトの名無しさん:2007/01/26(金) 14:09:40
すべて登録されているとは限らないし ――特に名前の方、
読みがアンビなのもあるから、必要なのは、読みがなふり支援ツール
じゃなかんべか。
510デフォルトの名無しさん:2007/01/26(金) 15:48:49
漢字にふり仮名を自動でつけるのは
ある程度は自動化できるが
同じ字で読みが違う場合もあるので(ex.徳沢 => とくさわ,とくざわ etc.)
完全な精度では無理。
511デフォルトの名無しさん:2007/01/26(金) 18:19:13
http://www.alles.or.jp/~tsuyama/name.htm
684万人を調べて、約7万8千種の名字ランキングを公開している人がいるぞ。
そのデータを使うのが手っ取り早いと思われる。
....しかし、ヒマ人だな〜。
512デフォルトの名無しさん:2007/01/26(金) 19:17:30
読みを当てはめるのも結局確率だから
↑のデータ使ってもやっぱ無理っしょ
513デフォルトの名無しさん:2007/01/26(金) 20:45:14
そこでAIの出番なわけだ
514デフォルトの名無しさん:2007/01/26(金) 20:52:49
そこでエスパーの出番なわけだ
515デフォルトの名無しさん:2007/01/26(金) 20:57:04
WindowsXP上でActivePerlを使ってるんですが、USBデバイスをコントロールする方法はありますか?
学習リモコンのクロッサム2+USBとデータをやりとりしたいんですが。
516デフォルトの名無しさん:2007/01/26(金) 21:07:32
>>511のリンク先より引用
----
名字 ふりがな 人数 順位 累積人数  累積比率
鈴木 スズキ 139,627 1  139,627 2.04029%
鈴木 ススギ 25 13,107 6,517,718 95.2398%
鈴木 ススキ 7 27,840 6,723,557 98.2476%
鈴木 スズノキ 3 41,426 6,795,040 99.2922%
鈴木 スズ 2 47,333 6,812,494 99.5472%
鈴木 スズシ 2 47,333 6,812,506 99.5474%
鈴木 スヅキ 2 47,333 6,812,518 99.5476%
鈴木 スス 1 56,150 6,832,142 99.8343%
鈴木 ススヘキ 1 56,150 6,832,147 99.8344%
鈴木 ススリキ 1 56,150 6,832,148 99.8344%
鈴木 スズギ 1 56,150 6,832,151 99.8344%
鈴木 ズスキ 1 56,150 6,832,308 99.8367%
鈴木 ズズキ 1 56,150 6,832,309 99.8367%
鈴木 ヌズキ 1 56,150 6,836,957 99.9047%
----

姓しかわからない状況で確実に読み仮名をつける方法は
>>513のAIじゃなく >>514のエスパーだな。
AIについて無知な>>513はAIと書けばかっこいいと思ってるのか?
517デフォルトの名無しさん:2007/01/26(金) 21:11:14
ヌズキはねーよw どう考えても書き間違いだろwww

あ、ヌズキさん見てたらごめんなさい><
518ヌズキ:2007/01/26(金) 21:24:52
呼んだ?
519デフォルトの名無しさん:2007/01/26(金) 21:26:36
名前の仮名振りは、人間がやってもかなり難しい。
自動化なんてとても無理。 入力補助が限界でしょうね。
520デフォルトの名無しさん:2007/01/26(金) 21:50:28
あと「ズスギ」さんと「ズズギ」さんが入れば
濁点のあるなしの組み合わせがそろうのにな
521デフォルトの名無しさん:2007/01/26(金) 22:00:02
読みが存在しない漢字が存在する
522デフォルトの名無しさん:2007/01/27(土) 00:46:22
たとえば、「東」と書いて「あずま」「ひがし」「とう」と、読み方がいろいろある。
漢字だけからは読み方は判別できない。
そのため、正しい読み方は、本人にしかわからない。
523デフォルトの名無しさん:2007/01/27(土) 00:52:27
同じクラスに五島(ごとう)と五島(ごしま)が居たことあるよ。
524デフォルトの名無しさん:2007/01/27(土) 01:09:35
>>523
おまえ、ひょっとして1年2組の時の近藤(こんどう)か?
おれ隣のクラスの権藤(ごんどう)だよ。おぼえてるか?
525 ◆TWARamEjuA :2007/01/27(土) 01:37:47 BE:4356285-BRZ(6761)
住基ネットワークに問い合わせれば総て解決♪
526デフォルトの名無しさん:2007/01/27(土) 15:01:28
>>515
キミの質問は、2つに切り分けないといけない。
1.クロッサム2のDLLのインターフェースが公開されているかどうか。
2.ActivePerl から DLLを呼び出せるかどうか。

両方とも「YES」だからできるのだが、質問の切り分けができず、
「1」の当否を回答者に調べさせるキミには無理だ。
527デフォルトの名無しさん:2007/01/27(土) 15:20:23
>>525
スーパーハッカーキタ━━━━━━(゚∀゚)━━━━━━ !!
528デフォルトの名無しさん:2007/01/27(土) 16:01:58
あふぉか
姓しかわからないデータと住基ネットのデータをどうリンクするんだよ。
>>525=>>527か?
くだらないネタにみんなスルーしてるわけだが、
自作自演するほど反応してほしかったのか?
529デフォルトの名無しさん:2007/01/27(土) 16:22:13
ネタだと思っているなら何故あふぉとか言ってマジ突っ込みするんだろう。分裂気味?
まぁ大方、真相がネタでもマジでも恥かかないよう工夫したら前後で矛盾が出たってとこか。
530デフォルトの名無しさん:2007/01/27(土) 17:17:34
まぁ未承諾さんだし。
531デフォルトの名無しさん:2007/01/27(土) 18:02:01
>>526
もちろんDLLとかWindowsの約束とかよく分かっておりません。
そのあと、mrccom.dllを見つけてWin32::APIでimportを試すところまで来ましたが、
unknown errorでimport出来ず\(^o^)/。どなたか気が向いたら教えてください。
532デフォルトの名無しさん:2007/01/27(土) 20:09:12
>>528
サブイ
533デフォルトの名無しさん:2007/01/27(土) 22:26:03
>>527,>>529,>>532
ここはvipでも口論・議論ではなくperlの質問箱スレだ。
前日の終わったネタをいつまでも引きずったり、
指摘されて逆切れして粘着するぐらいならほかのスレ行けよ
534デフォルトの名無しさん:2007/01/27(土) 22:45:22
>>528=533 別に君以外誰も文句も言ってないし、しきりも頼んでないけど。
頓珍漢レスを>>529に指摘されて逆ギレしてる張本人乙にしかみえないよ?w
535デフォルトの名無しさん:2007/01/27(土) 22:52:37
粘着だが逆ギレだか知らんが、
PerlのスレでPerlの話をしないやつはすべて平等に価値がない
536デフォルトの名無しさん:2007/01/27(土) 23:29:55
ここは批判されると30分以内に逆切れコメントする527を観察スレですか?
537デフォルトの名無しさん:2007/01/28(日) 00:35:56
>>531
>どなたか気が向いたら教えてください。
まず、C++を勉強しろ。C++でDLLを扱えるようになること。
PerlでDLLを扱う話はそれからだ。
538デフォルトの名無しさん:2007/01/28(日) 01:35:42
>>533
ここはvipでも口論・議論ではなくperlの質問箱スレだ。
前日の終わったネタをいつまでも引きずったり、
指摘されて逆切れして粘着するぐらいならほかのスレ行けよ
539デフォルトの名無しさん:2007/01/28(日) 02:58:29
    __
    |   |
    |   |   ___                  ___
    |   | .  /     |  __    _____   / _  \
    |   |  /  /|  |  /  /   / ____/  / /  >  l
    |   |. /  / .|  |. /  /   / /..   _    /   ̄  /
    |   |/  /  |  |/  /   /   ̄ ̄_/   /      \
    |       /.   |     /   / / ̄ ̄ __   /  / ̄ ̄>  |
    |    /   |___/  ./   ̄ ̄ ̄ /  /    ̄ ̄  /
     ̄ ̄ ̄             ̄ ̄ ̄ ̄ ̄     ̄ ̄ ̄ ̄ ̄     _____      ___ ___    ___
    ______                             /__  __/ [][] _| |_| |__ _| |_
     |  ___  \                               / /     |    _  | |_  レ'~ ̄|
     |  |    \  l                              |  |_      ̄|  | / / /   /| |
     |  |____/  /                             \__|      |  |  ̄ /_  /.  | |_
     |  ____/ ___  __    __/ヽ                    |_|.     |__|.   \/
     |  |     /`、_/_/ / _ ヽ  / _  /
     |  |     ヽ  /   | l   l l  | l   l l
     |  |       | l     ヽ  ̄ /  ,ヽ  ̄ /
      ̄          ̄      ̄ ̄  / __ ヽ
                        | l     l l
                        ヽ  ̄ ̄ /
                         ~ ̄ ̄~
540デフォルトの名無しさん:2007/01/28(日) 03:41:10
それ、もう少し小さくならんか。
541デフォルトの名無しさん:2007/01/28(日) 04:14:20
  Web
      でやれ
  Prog
542デフォルトの名無しさん:2007/01/28(日) 04:16:24
vv3bpr0gマ”ゃれ
543デフォルトの名無しさん:2007/01/28(日) 21:16:33
Image::Magickで32bit(RGBA)のpngを読み込んで、24bit(RGB)のpngに書き出したいんだけど、
どうやればいいか教えてください。
544デフォルトの名無しさん:2007/01/28(日) 21:39:34
http://mechanics.civil.tohoku.ac.jp/soft/node43.html
convertで24bit Raw RGBで出力して
それを再度pngで出力すればいいんでね?
545543:2007/01/29(月) 00:12:46
もう少し調べてみたら、
$im->Set(matte => 0);
で解決できました。スレ汚しごめんなさい。
546デフォルトの名無しさん:2007/01/30(火) 20:26:33
threads::shared なんですが、
例) $var : shared;
と言うのは、文法的にどういう意味なのでしょうか?
threadsだけに許された特殊な文法なのでしょうか?
547デフォルトの名無しさん:2007/01/30(火) 21:18:54
attributes
548デフォルトの名無しさん:2007/01/30(火) 22:02:55
>>547
ありがとうございます
CPANで見ても英語がさっぱりで…
分かり易く解説されているページ等はないでしょうか
はてなのは見ましたがさっぱりです
549デフォルトの名無しさん:2007/01/31(水) 17:01:01
質問です
UNIX系OSやWindowsで
.soや.dllを利用したいのですが、
どうするのが一般的でしょうか?
出来れば日本語の解説ページをお願いします
550デフォルトの名無しさん:2007/01/31(水) 23:53:20
質問です
コマンドラインでカウントダウンってできますか?

C:\>perl hoge.pl
次の処理まで待ち時間: 5秒...

のところ “5”の部分のみが 4 3 2 1... と更新されていくようにしたいのです
いちおー system "cls (もしくは) clear "でスクリーンごと更新とかは なしで

Activeperlですが cpanで解決するなら cpanでも結構です

よろしく〜
551デフォルトの名無しさん:2007/02/01(木) 00:00:31
>>550
¥b
552デフォルトの名無しさん:2007/02/01(木) 00:05:34
>551
うおっ! ありがとうございます!!
さっそくそのキーワードで調べてみます!!
553デフォルトの名無しさん:2007/02/02(金) 13:47:58
perlでISHテキスト←→バイナリ変換するモジュールってある?
一通りCPANしたりぐぐったりしてみたが見つからなかったんだけど。
554デフォルトの名無しさん:2007/02/02(金) 15:02:25
質問です。
項目数(列数)が多いCSVのデータを読み込んで処理するとき、皆さんはどうしてますか?

私は10項目くらいでしたら
my($id, $name, $age, ..) = split /,/;
と、それぞれ変数を用意するのですが、

100項目を超えるような場合、項目名を要素とする配列を用意しておき
@col_name = qw(id name age ..);

連想配列に格納して
my @array = split /,/;
my %hash = ();
for(0..$#col_name) {
  my $key = $col_name[$_];
  my $val = $array[$_];
  $hash{ $key } = $val;
}
$tel = $hash{tel};

今扱ってるCSVはデータの件数(行数)が500件あって、上記の連想配列の格納をその件数分繰り返し行なっています。

555554:2007/02/02(金) 15:03:04
「項目名 => 項目番号」の連想配列を用意しておくのがいいのかなとも思うのですが、
%col_no = (
  id => 0,
  name => 1,
  ...,
  );
$tel = $array[ $col_no{tel} ];
↑ちょっと読みづらいかなとも思います。

項目数・項目名が変わる可能性は低いです。
効率よりも読みやすさ重視です。

よろしければ、ご意見お聞かせください。
556デフォルトの名無しさん:2007/02/02(金) 15:07:30
$tel = $array->[$i]->{'col_no'}->{'tel'};
557デフォルトの名無しさん:2007/02/02(金) 15:09:34
$tel = $array->[$i]->{'tel'};
これでいいのか
入れ方は任せる
558デフォルトの名無しさん:2007/02/02(金) 18:22:13
@col_name = qw(id name age); # member

$_ = "1,hiroyuki,30"; # csv
@$record{@col_name} = split /,/;


#
print $$record{id},"\n";
print $$record{name},"\n";
print $$record{age},"\n";
559デフォルトの名無しさん:2007/02/02(金) 21:32:19
利便性の為にハッシュを使わざるを得ないのが気になってるんじゃないの?
配列でやりたいなら、こんなことしちゃったり:

my $r = MyRecord->new(split /,/);
print("$r->name\n");

package MyRecord;
BEGIN {
my $i = 0;
my @col_name = qw(id name age); # カラム名を設定。
for my $n (@col_name) {
eval qq{ sub $n :lvalue { \$_[0][$i] }};
$i++; }}

sub new { bless [@_[1..$#_]], $_[0]; }
560デフォルトの名無しさん:2007/02/02(金) 21:34:18
ミス。
print("$r->name\n")
修正 → print($r->name, "\n")
561デフォルトの名無しさん:2007/02/02(金) 22:02:33
>>559
evalで作るのと、*{...} = sub{}で作るのどっちがスマートなんだろ。
562デフォルトの名無しさん:2007/02/02(金) 22:22:43
evalはパーサが動く分遅くはなりそうだけど
通常の定義と見た目が一貫してるから読みやすいかも。

シンボルテーブル+クロージャだと、クロージャ作る側のレキシカルな環境?も意識しないとならないし、ちょっと嫌。
563554:2007/02/03(土) 10:09:16
>>556-562
ご回答ありがとうございます。

いろいろ方法があるのですね。
まだご回答の内容が理解できていないので、勉強してきます。
564デフォルトの名無しさん:2007/02/04(日) 09:24:15
他人が作った、FTPで複数のファイルを受信する為の処理に手を入れなくては
いけないのですが、元のソースにエラー時の処理が全く入っていません。

$ftpcmd = ○○○ #<-ftpコマンドが記述されたテキストファイル
system("ftp -n < $ftpcmd);

対象ファイルは複数あって mget logfile*.* で取って来ています。
ファイルが取って来れなかったり、相手に接続できなかったりといったような
エラーが起きた事を判定するにはどのようにすればいいのでしょうか?
PerlもLynuxも初めてなので、出来るだけ簡単な方法を教えていただけると
ありがたいです。

よろしくお願いします。
565デフォルトの名無しさん:2007/02/04(日) 13:04:46
Net::FTP で書き直したらいいんじゃないかな。
566デフォルトの名無しさん:2007/02/04(日) 15:35:04
>>564
Net::FTPでスクリプト書く例
http://search.cpan.org/~gbarr/libnet-1.20/Net/FTP.pm

モジュールが入ってなかったら「perl CPAN」でググってCPANの使い方覚えていれろ
567デフォルトの名無しさん:2007/02/04(日) 16:26:22
Lynuxはおらも初めてだ
568デフォルトの名無しさん:2007/02/04(日) 17:13:07
>>565-566
そのやり方で書き直してみます。
ありがとうございました。

>>567
Linuxの打ち間違いですね。
569デフォルトの名無しさん:2007/02/05(月) 23:30:35
>>565-566

教えていただいた方法で組んでみたのですが、複数のファイルをワイルドカードで
指定して取って来るにはどうしたらよいのでしょう?

対象のファイル名には出力された日付と時刻が含まれていて、個数も名前も不定
なのです(○○○YYYYMMDDHHMM.logのようなファイル名で、日付部分が
当日のものだけ取って来たいのです)。

何度もすみませんがよろしくお願いします。

570デフォルトの名無しさん:2007/02/06(火) 01:45:03
sub mget {
   my($ftp,$pattern) = @_;
  foreach my $file ($ftp->ls($pattern)) {
     $ftp->get($file) or warn $ftp->message;
  }
}
571デフォルトの名無しさん:2007/02/06(火) 23:22:19
>>570
どうもありがとうございます。
上手く持ってこれました。

572デフォルトの名無しさん:2007/02/07(水) 11:31:08
希望結果を得たいのですが、実行結果の通りになります
以下のソースで実行結果になることは納得できるのですが、
希望結果を得るためにはどうすれば良いのでしょうか?

●ソース
@$data=(
{'name'=>'test1','pay'=>'1000','cancel_flg'=>'0','create_date'=>'20070131','cancel?date'=>''},
{'name'=>'test2','pay'=>'2000','cancel_flg'=>'1','create_date'=>'20070110','cancel_date'=>'20070120'},
{'name'=>'test3','pay'=>'100','cancel_flg'=>'0','create_date'=>'20070201','cancel_date'=>''},
);
foreach(@$data){
push(@lst,$_);
if($_->{cancel_flg}){
$_->{create_date}=$_->{cancel_date};
$_->{pay}="-".$_->{pay};
push(@lst,$_);
}
}
print "$_->{name}\t$_->{pay}\t$_->{create_date}\n" foreach(@lst);

●実結果
test1 1000 20070131
test2 -2000 20070120
test2 -2000 20070120
test3 100 20070201

●希望結果
test1 1000 20070131
test2 2000 20070110
test2 -2000 20070120
test3 100 20070201
573デフォルトの名無しさん:2007/02/07(水) 11:44:59
foreach(@$data){
push(@lst, {%$_});
574デフォルトの名無しさん:2007/02/07(水) 11:55:08
>>573
ありがとうございます
希望どおりの結果を得られました
ハッシュ内のデータを1つずつ別のハッシュに移し替えることで回避していましたが
これからはソースがスマートになりそうですw
私が無知なだけだと言う話かも知れませんが、勉強になりました
575デフォルトの名無しさん:2007/02/07(水) 12:23:24
こういうことだな。
$X = ['A'];
$Y = $X; #リファレンスデータのポインタ(?)だけをコピーして、データそのものはコピーしてない。
$X->[0] = 'B';
print $Y->[0];

結果「B」
576デフォルトの名無しさん:2007/02/07(水) 12:36:30
ちょっとCPANで調べるとStorableのdcloneとか、
Clone(::More/Fast/PP/Any...)とかなんかたくさんあるんだけど
どれを使うのがいいんだよ
577デフォルトの名無しさん:2007/02/07(水) 12:39:19
俺は年寄りなのでcancelないときもコピーすんのもったいないと思ってしまう
578デフォルトの名無しさん:2007/02/07(水) 13:56:18
辞書みたいなものを作っているのですが、見出し語にダブりが多数あります。
こんな感じで。

<midashi>kuki</midashi>
茎とはクキである。・・・・・

<midashi>kuki</midashi>
  茎とはクキである。・・・・・

見出し部分タグ内が同じ場合のみ、一つ残してダブりのぶんは見出しも本文も消す、
という作業を行いたいのですが、perlで出来ますか? 
何を勉強すればよいのか、示唆頂ければありがたいです。
579デフォルトの名無しさん:2007/02/07(水) 14:05:52
xmlなら、専用のエディタ使う方がよっぽど早くて安全だと思うのだが。
580デフォルトの名無しさん:2007/02/07(水) 16:05:05
ファイルのパースさえ出来れば楽勝だろうけどたぶんそこが一番の問題だと思う
機械読み取りを考慮した仕様になってればいいんだが
581デフォルトの名無しさん:2007/02/07(水) 22:15:16
配列を初期化したいのですが、どのようにすればいいのでしょうか?

引き渡したパスにあるファイル名を配列に入れて、そのファイル1つ1つを順繰りに
処理していきたいのですが、1度処理をした後でもう1度処理を行うと、最初に配列
にセットしたファイル名が配列に残ってしまっています。
下のソースだと、「1回目」と「2回目」のところでは同じ内容のファイル名が表示
されます(2回目では何も表示されないで欲しいです)。
どこがおかしいのでしょうか?ご指導を宜しくお願いします。

sub aa{
($path) = @_;
@localfl;
@dir;

opendir(DIR,$path) || return(-1);
@dir = readdir(DIR);
foreach $f (@dir){
if($f =~ /^\.\.?/){ next;}#親&カレントフォルダ(.と..)を除外
$localfl{$f} = $f;
}
foreach $f (sort(keys(%localfl))){
print("1回目 $f\n");
}
undef @localfl;#これでクリア?
@localfl = ();#これでクリア?
foreach $f (sort(keys(%localfl))){
print("2回目 $f\n");
}
}
582デフォルトの名無しさん:2007/02/07(水) 22:20:07
@localfl と %localfl は別物ですよ
583デフォルトの名無しさん:2007/02/07(水) 22:55:59
なぜに Perl4 …
変数全部グローバルだし
584デフォルトの名無しさん:2007/02/07(水) 23:05:43
>>582
@localflには最初から何も入ってなくて、%localflをクリアしてないから
前の中身が残ってるということでしょうか?
%localflの中身をクリアすればOKですか(%localfl=""; とか・・?)

>>583
すみません、まだPerl触り出して1週間のド素人なもので・・。
585デフォルトの名無しさん:2007/02/07(水) 23:30:02
%localfl = ();
586582:2007/02/07(水) 23:36:52
とりあえず >>585 の %localfl = (); または undef %localfh; で意図する結果が得られます

バグの温床になるのを防ぐために use strict; と use warnings; をお薦めします
変数を宣言するときは my を使ってください
適当に書き直したらこんな感じでしょうか

use strict;
use warnings;
sub aa {
my ($path) = @_;
opendir(my $dh, $path) or return -1;
my @localfl = sort grep { ! /^\.\.?/ } readdir($dh);
foreach my $f (@localfl) {
print("1回目 $f\n");
}
}
587デフォルトの名無しさん:2007/02/08(木) 00:19:07
>>585
>>586

丁寧に教えていただきありがとうございました。
参考にさせていただきます。
588デフォルトの名無しさん:2007/02/08(木) 20:09:30
Encodeモジュール使い方を勉強中です。
なんとか試行錯誤しながらやってるんですが、
Data::Dumper がやたら文字化けします。
Dumper無しで出力すると化けないので
エンコードの部分は間違ってないと思うのですが。
589デフォルトの名無しさん:2007/02/08(木) 20:16:37
use strict;
use utf8;
use Data::Dumper;
binmode STDOUT,":encoding(cp932)";
my $str="あああ";
print Dumper $str;
print $str;
以上をutf8で書いて実行すると
$VAR1 = "\x{3042}\x{3042}\x{3042}";
あああ
となります
どうにかして日本語をDumperする方法はないでしょうか?
590578:2007/02/08(木) 20:17:25
ありがとうございました。
XML エディタ で検索してみましたが、どうもよく分かりませんでした。
ちなみに見出しは全部でaからzまで数十万あります。
ダブり語は多分、数千種類が各2〜7個くらいダブっています。
差し支えなければ、使えそうな専用エディタを教えて頂けないでしょうか?

ファイルのパースさえ出来れば楽勝だろうとおっしゃるのは素晴らしいです。
ちなみに楽勝というのはperl で、ですか? 
機械で読むというのがよく分からないのですが(すみません)、多分txt形式で
50MBくらいのファイルになりそうで、そこまでは出来ます。
591588=589 :2007/02/08(木) 20:19:08
ちなみに環境は WindowsXP sp2 上で、ActivePerl Build 819 使用しています。
592デフォルトの名無しさん:2007/02/09(金) 02:39:44
なんとなくWebProgからきました。取り留めもない質問なんですがお願いします。

WEBの掲示板などでよく、特定のタグだけ書き込み許可してますよね。それを実現するのに
下記のようなコードを書きました。最近、WEBに限らず、テキスト系の処理は何するにも
こんな感じでsplitして再帰する書き方に固執してしまってます。
字ヅラ的には短くて気に入ってるんですが、処理的には効率悪い気がしてならないのです。
もっとうまい方法があるでしょうか。

sub escape_limited {

my %args = (str => '', @_);

$exception = q!</?(?:a|img|blockquote|pre|code|span)(?:\s[^>]*)?>!;

my @scraps = split(/($exception)/im, $args{'str'}, 2);

if ((scalar @scraps) == 3) {

return &escape(%args, str => $scraps[0]). $scraps[1]. &escape_limited(%args, str => $scraps[2]);
}

else {

return &escape($args{'str'});
}
}
593デフォルトの名無しさん:2007/02/09(金) 04:00:04
sub escape_limited {
  my %args = (
    str     => '',
    allowed => qr{a|img|blockquote|pre|code|span},
    @_
  );
  my $text = $args{str};
  $text =~ s{( < (?! /? (?:$args{allowed}) \b ) [^>]* > )}{ escape($1) }iegx;
  return $text;
}

とかでどう?
594デフォルトの名無しさん:2007/02/09(金) 09:53:04

$LT = quotemeta escape("<");
$GT = quotemeta escape(">");

($str = escape($str)) =~s/$LT\/?(a|img|b|blockquote|pre|code|span)\b.*?$GT//ig;

とかねー。多分軽いよ。

タグ内に'<' '>' が無いことを前提にしてるみたいだけど、大丈夫?
属性も調べないと、スタイルシートとかスクリプトとか埋め込まれる可能性もあるし。
595デフォルトの名無しさん:2007/02/09(金) 10:35:31
うおっ、間違えた。正規表現のリテラルのトコ…。
s/$LT(\/?(?:a|img|b|blockquote|pre|code|span))\b(.*?)$GT/<$1$2>/ig

だわな。スマソ
596デフォルトの名無しさん:2007/02/09(金) 13:59:17
試しました。
592(私):スプリット型
593:一発置換型
594:例外事後処理型

マッチングがひとつもない場合
592:速い
593:圧倒的に遅い
594:速い

マッチングがある場合
592:圧倒的に遅い(しかも多重再帰の警告でまくり)
593:少し速い
594:速い

一旦、なりふり構わず置換してから例外を元に戻すってのは、
分かりやすいだけで処理的に気持ち悪いと思ってましたが、
意外と効率いいんですね。
597デフォルトの名無しさん:2007/02/09(金) 14:07:03
お礼を忘れました。みなさんありがとうございます。
ひとつ、事後処理型の場合、対象文字列に最初からエスケープ文字が
含まれてるケースを考慮する必要がありますね。これが一番やっかいかなあ。
598デフォルトの名無しさん:2007/02/09(金) 14:10:29
いや、一旦、二重エスケープになって元に戻るからいいのか。
混乱してきたので仕事に戻ります。
599デフォルトの名無しさん:2007/02/09(金) 15:02:53
>>590
テキスト読み込んで処理はPerlの得意とする分野なので楽勝

タグは<midasi></midasi>だけなのか?その他のタグがあったとして処理する必要はないのか?
複数の同じ見出しに対し残す本文はどれでもいいのか?
本文中にタグや特殊文字があったりした場合は?一意に判別できるエスケープの仕様はある?

あたりの仕様さえ確定できればファイル読み込みのやりかた、正規表現、ハッシュあたり覚えればできるっしょ
ちゃんとしたXML形式になってるなら専用のパーサ使えば楽が出来るが、正規表現でも十分なように思える
600デフォルトの名無しさん:2007/02/09(金) 23:36:51
ちゃんとしたXMLになってなくても、XML::Liberal使えばわりといける。
601デフォルトの名無しさん:2007/02/10(土) 03:35:34
wxperlを使ってGUIのメモ帳を作っています。ファイルを新規に保存するとき
ファイルと同名のフォルダをつくりたいのですがなぜかうまくいきません。
my $filename = $saveasdialog->GetPath;  
$this->{text_ctrl_1}->SaveFile($filename);
mkdir($filename);

このスクリプトで、一行目でwxperl filedialogオブジェクトにより
ファイル名が取得され$filenameに入ります。2行目でsavefileメソッドで
テキストが$filenameの通りに名前がつけられ保存されます。これは正常にいきます。
しかし、3行目のコードではフォルダが作成されません。

wxperl固有というよりもperlのコードの書き方に問題があるような気がするのですが、
アドバイスがあったらお願いします。
602デフォルトの名無しさん:2007/02/10(土) 03:46:04
> ファイルを新規に保存するときファイルと同名のフォルダをつくりたい

なんじゃそりゃ??
603デフォルトの名無しさん:2007/02/10(土) 03:54:30
どの OS でテストしてるんだか知らないけど、ファイルシステム側の問題だろう。
例えば Windows では同名のファイルとフォルダは作れない。
604601:2007/02/10(土) 04:31:21
>>603
すみませんでした。windows xp, active perl環境です。
>例えば Windows では同名のファイルとフォルダは作れない。
これは知りませんでした。というか大昔に聞いたことがあるような気がしますが
盲点でした。
mkdir($filename."Folder");
のようにしたら("作成したファイル名"Folder)という名前でフォルダが出来ました。
自分の考えている機能としてはこれで十分先に進めそうです。
ありがとうございました。
605デフォルトの名無しさん:2007/02/10(土) 13:39:41
て言うか、同名のファイルとフォルダを作れるファイルシステムってあったっけ?
606デフォルトの名無しさん:2007/02/10(土) 13:43:46
同名のファイルとフォルダがあるとApacheがまいっちんぐしちゃうよ
607デフォルトの名無しさん:2007/02/10(土) 15:15:31
>>605
むかし、「同名のファイルとディレクトリ作れるんじゃねえ!!」と怒った記憶がある。
608デフォルトの名無しさん:2007/02/10(土) 17:42:01
これも拡張子を非表示にするゆとり教育の弊害か…
609デフォルトの名無しさん:2007/02/10(土) 18:27:55
これもファイル名とディレクトリ名を同じ名前空間に置くという異常なことを
やったUNIXの弊害か……
610デフォルトの名無しさん:2007/02/10(土) 18:44:58
初学ながらリファ本片手にCGIスクリプトを書いています。
下記のような問題にぶつかるもどうにも解決方法がわかりません。
どうすればよいか教えてください。よろしくお願いします。

【やりたいこと】
 投票CGIの改造で、イエスノーの2択の選択肢の投票に応じて、表示されて
いる数字も増減されるようにしたい。 数字の増減はカウンタスクリプトを流用し
ています。

【現在書いているスクリプト(抜粋)】
open(FILE, "+<./count.dat") or die("エラー:カウントファイルが開けません");
eval { flock(FILE, 2); };
$counta = <FILE>;
seek(FILE, 0, 0);
if($item == 1 ){ print FILE $counta+1 } else { print FILE $counta-1 }
close(FILE);

【問題点】
 例えば現在の$countaの値が100で、値が-1される場合、結果は99となって欲しいのに、990と
なって返ってきます。1000から999の場合なども同じです(どうも桁数が減る場合にうまく動作し
てくれない模様)。

【解決したいこと】
 100が99になって欲しい場合、その動作が990とならず希望どおり表示されるようにしたいです。

【その他】
 同じ桁数が変わる場合でも、99→100など、桁数が増える場合は問題が発生しないです。
611デフォルトの名無しさん:2007/02/10(土) 18:45:26
ファイル名とディレクトリ名の名前空間が異なるなんて想像したら
そちらの方が異常だと思うが。

そもそもそいった実装のOSはあるんかえ?
612デフォルトの名無しさん:2007/02/10(土) 18:58:46
>>609
最近それで頭に来てる。百万個を越えるファイルを持つ非常に巨大なファイルツリーを
トラバースするのにリソース食いまくり。
やっぱり分けてあるシステムってあるんだ。
613デフォルトの名無しさん:2007/02/10(土) 19:19:45
>610

use Fcntl qw/:flock/;

open my $fh, '+<', './count.dat' or die $!;
eval { flock $fh, LOCK_EX };
$count = <$fh>;
seek $fh, 0, 0;
print $fh $item == 1 ? $count + 1 : $count -1;
truncate $fh or die $!;
close $fh;
614610:2007/02/10(土) 19:27:24
>>613
正直、書かれている内容がさっぱり分からないので、リファ本で読み進めながら
テストしたいと思います。ありがとうございます。
615610:2007/02/10(土) 21:14:23
>>613
早速アドバイスを実装したところ、思った通りに動いてくれました。
どうもtruncateがポイントだったようですね。ありがとうございました。
616デフォルトの名無しさん:2007/02/11(日) 04:18:34
正規表現でマッチしたものを任意の変数に入れて(もしくは任意のエイリアスに結びつけて)、
後で取り出すことって出来るのでしょうか?
マッチした順に$1や$2ではなく、(.*?>$name)とかした時、
(.*?)のマッチを$nameで受け取れると非常に嬉しいのですが。。
どなたかアドバイスいただけると嬉しいです。。
617デフォルトの名無しさん:2007/02/11(日) 05:58:10
>>616
マッチした後に代入しておくんじゃなんで駄目なんだ?
if (/(.*?)/) {
$name = $1;
}
618デフォルトの名無しさん:2007/02/11(日) 06:01:14
>>616
マッチしたもののリストが返ってくるのでそれを受け取る
($a, $b) = /^(.)(.)/;
619616:2007/02/11(日) 09:49:39
>>617-618
返信ありがとうございます _ _
なぜエイアリアスに結びつけたいかというと
βのウェブサービスのラッパーを作っていて、
正規表現がころころ変わる可能性がある(欲しい文字列が前後する可能性がある)からです。
欲しい文字列が前後してしまうと正規表現だけでなく、
その後の正規表現を受け取るコードも変更しなければならなくなってしまうので。。
# 正規表現を正規表現で自動生成するスクリプトを作っていたら、
# 文字列が前後した場合その部分は自動化できなくなってしまうことに気づき、
# 質問させて頂きました。
620デフォルトの名無しさん:2007/02/11(日) 11:04:20
>>588,599
それは文字化けでなく、エスケープされてるだけ。
Data::Dumper の仕様
621デフォルトの名無しさん:2007/02/11(日) 11:30:06
詳説正規表現第2版 7.8.8 名前つきキャプチャを模倣する
(.*?)(?{ $name = $^N })
622592:2007/02/11(日) 15:22:43
タグそのものだけでなく、例えば<pre>の内側はエスケープしない、など、
ちょっと込み入っている場合、例外事後処理だと信じられないほど遅くなりました。
コーディングに問題があったかも知れませんが。
という訳でスプリット型に戻しました・・。もっとうまい方法があるでしょうか。

sub escape_limited {
 
 my %args = (str => '', exception => [], exception_block => [], @_);
 
 my @regexp_array;
 
 (scalar @{$args{'exception_block'}}) and push(@regexp_array, sprintf(q!<(%s)\b.*?>.+?</\2>!, join('|', @{$args{'exception_block'}})));
 (scalar @{$args{'exception'}}) and push(@regexp_array, sprintf(q!</?(?:%s)\b.*?>!, join('|', @{$args{'exception'}})));
 
 return &loop($args{'str'}, join('|', @regexp_array));
 
 sub loop {
  
  if ($_[1]) {
   my @scraps = split(/($_[1])/is, $_[0], 2) ;
   return &escape($scraps[0]). $scraps[1]. &loop(pop(@scraps), $_[1]) if ((scalar @scraps) >= 3);
  }
  
  return &escape($_[0]);
 }
}
623デフォルトの名無しさん:2007/02/11(日) 18:28:22
>>619
たぶんアプローチが根本的に間違ってる。
624616:2007/02/11(日) 19:05:54
>>621
ありがとうございます!知らなかったです使わせて頂きます。
http://search.cpan.org/dist/perl/pod/perlre.pod
>>623
良くあるので、今回もそうかもしれないのですが;
http://www.nicovideo.jp/の検索のラッパーとして
http://www.kiseki.info/niko-per/matome_search.cgiを作りました
そして、上記ラッパーの正規表現生成に、
http://www.kiseki.info/niko-per/regexNikoniko.txt
というコードを使っていました。(>>621さんのアドバイス未導入コード)
お暇があればアドバイスいただけると幸いです。
625デフォルトの名無しさん:2007/02/11(日) 22:38:26
前から疑問に思ってたんですが、
$input = 'hoge';
$output = $input;
$output =~ s/ho/ha/g;
return $output;
これを$outputを使わずにreturn &func($input, /ho/, 'ha');
みたいに表現することはできないんでしょうか。
626デフォルトの名無しさん:2007/02/11(日) 22:54:33
こんなん?
join('ha', split(/ho/, $input))
627デフォルトの名無しさん:2007/02/11(日) 23:09:34
return str_replace('ho', 'ha', $input);
628デフォルトの名無しさん:2007/02/11(日) 23:11:41
>>627
どこの国のPHPだよ
629デフォルトの名無しさん:2007/02/12(月) 00:06:59
関数的な操作が充実してる割に標準でついてる関数がほとんど破壊的なんだよな
630592:2007/02/12(月) 00:10:16
すみません、うそを言いました。594さんのがやっぱり一番速いです。
遅くなったのはバグでした。スレ汚しすみません。
631デフォルトの名無しさん:2007/02/12(月) 02:58:08
パッケージが提供してる関数の一覧って簡単に取得できますか?
632631:2007/02/12(月) 03:15:00
ちょっとぐぐったら見つかりました。すみません。
http://search.cpan.org/~mlfisher/pmtools-1.01/pmeth
サブクラスなどにもぐっていく処理もありますが、どうもこの行がミソのようでした。
keys %{ "$module::" }
633デフォルトの名無しさん:2007/02/12(月) 07:44:44
動的に生成された複数のPNG画像データをzip圧縮したいと考えています。

GDモジュールとArchive::Zipモジュールが活用できそう、
と調べたのですが不明点があります。

Archive::ZipモジュールのaddFileメソッドは引数としてファイル名が必要ですが、
GDモジュールのpngメソッドで動的に生成されたPNG画像データをzip圧縮するにはどうしたら良いでしょうか。
生成されたPNGデータをbinmodeを使用して画面表示するサンプルは見かけたのですが・・・

Perlを勉強し始めたばかりで基本事項も良く分からず五里霧中です。
アドバイスのほど、よろしくお願いいたします。
634デフォルトの名無しさん:2007/02/12(月) 09:40:25
addString
635デフォルトの名無しさん:2007/02/12(月) 13:43:39
system() で所定の場所からwgetでファイルを持ってくる処理を作っています。
必ずしもその場所にファイルがあるとは限らないので、ファイルが無かった時と
接続出来ないなどで取ってこれなかった時を判定したいのですが、どうすれば
よいのでしょうか?
636デフォルトの名無しさん:2007/02/12(月) 13:47:37
system関数の戻り値でチェックできないの?
637デフォルトの名無しさん:2007/02/12(月) 14:20:49
>>636
ありがとうございます。
やってみましたが、ファイルが無かった時も接続できなかった時も、戻り値は
256となるので区別がつかないです・・。
638デフォルトの名無しさん:2007/02/12(月) 14:21:07
wgetの複雑な機能をバリバリ使ってるなら別だが、ただファイルとってくる
だけならLWP使う方がその辺のエラー処理は書きやすいと思うけどな。
639デフォルトの名無しさん:2007/02/12(月) 14:39:33
>>638
すみません、wgetを使わないといけないので別の方法で取ってくるというのは
出来ないのです。
640デフォルトの名無しさん:2007/02/12(月) 15:06:35
美しくないがstderr読むしかないだろう
641デフォルトの名無しさん:2007/02/12(月) 15:11:25
接続とファイル存在チェックだけ別ルーチンで作っといて、
それがOKならwgetで取ってくるってのはどうだ?
642デフォルトの名無しさん:2007/02/12(月) 15:59:14
>>640,641
ありがとうございます。>>640さんの方法の方が簡単そうなのでこちらで
いこうと思うのですが、

open(STDERR, ">> errmsg.txt");
$ret = system("wget 〜");
close(STDERR);

とやって、$ret が256 だったらerrmsg.txtを1行づつ読み込んで
[ 404 Notfound ]という文字列が見つかったらファイルなし、無い
ならその他のエラー、という感じでいいのでしょうか?
643デフォルトの名無しさん:2007/02/12(月) 16:27:24
というかwgetはちゃんと終了コード返すけど?

# wget -q http://www.google.com/ && echo ok
ok
# wget -q http://www.google.com/nonexist || echo ng
ng
#
644デフォルトの名無しさん:2007/02/12(月) 16:28:39
あーごめん、404と接続できなかった時とを区別したいのか。早とちりスマソ。
645デフォルトの名無しさん:2007/02/12(月) 20:57:32
気にしてへんからええよ。
書いてくれてありがとな。
646デフォルトの名無しさん:2007/02/13(火) 00:23:46
>>642
perldoc IPC::Open3
647デフォルトの名無しさん:2007/02/14(水) 00:10:02
数字と文字が混在した要素からなる配列があるんですけど、これをsortすると
1〜〜,11〜〜,2〜〜,23〜〜・・・
という風になってしまいます。
これを数字順
1〜〜,2〜〜,11〜〜,23〜〜・・・
にするにはどうすればいいのでしょうか??
648デフォルトの名無しさん:2007/02/14(水) 00:17:12
>>647
@dst = sort { $a <=> $b } @src; # 数値ソート
@dst = sort { $a cmp $b } @src; # 文字列ソート(こっちは略せる)
649デフォルトの名無しさん:2007/02/14(水) 00:39:50
>>648
それ試したんですけど、数字順にならないんです・・orz
650 ◆TWARamEjuA :2007/02/14(水) 00:49:01 BE:3049474-2BP(6811)
@dst = sort { sprintf qq|%02d|,$a cmp sprintf qq|%02d|,$b } @src;
とかとか♪
651デフォルトの名無しさん:2007/02/14(水) 00:53:47
>>650
Sort subroutine didn't return a numeric value
ってエラーがががorz
652脱帽:2007/02/14(水) 00:59:09
ちょうてけとう

@dst = sort { ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] } @src;
653デフォルトの名無しさん:2007/02/14(水) 00:59:59
print join qq/, /, sort { $a <=> $b } qw/21d 1aa 11b 2cc 13e 5b/;
1aa, 2cc, 5b, 11b, 13e, 21d

ちゃんとなってるけどなあ
654デフォルトの名無しさん:2007/02/14(水) 01:08:03
>>653
いろいろ試したらできました。
splitを何回か使って要素の中の数列にまで要素を分割して比較したらうまくいきました。
俺なんかに付き合ってくれてありがとうございましたm(_ _m)
655デフォルトの名無しさん:2007/02/14(水) 05:36:07
ひ〜(悲鳴)
656デフォルトの名無しさん:2007/02/14(水) 06:05:37
(悲鳴)
657デフォルトの名無しさん:2007/02/14(水) 06:25:24
 シュー 三(悲鳴)
658デフォルトの名無しさん:2007/02/14(水) 06:31:03
質問〜perlから直接web上のファイルを開く事はできますか?
ソースをテキストで保存したくて

open(IN,"http://****・・・") or die "無理";

ってやってみたら無理でした。
659デフォルトの名無しさん:2007/02/14(水) 06:56:37
startup.plに
print int rand 10;
のようなコードを入れたtest.plをrequireして実行すると
↓↓httpdプロセス番号(実行結果)↓↓
1(3), 2(3), 3(3), 1(5), 2(5), 3,(5), 1(2), 2(2), 3(2)
のように完全でない乱数がある規則で発生してしまいます。
srandを加える、もしくはtest.plを意図的に更新し共有メモリから外すと期待通り全て違う表示がされます。
なぜこのような動作になるのか教えていただけませんでしょうか。
環境はFedora core5、Perl v5.8.8、mod_perl-2.0.2-5.1、httpd-2.2.2-1.2(prefork)です。
660デフォルトの名無しさん:2007/02/14(水) 07:17:33
661デフォルトの名無しさん:2007/02/14(水) 07:32:33
あ、ありがとうございます!
お陰で心置きなく寝れます。いや、仕事でした。いってきます;;
662デフォルトの名無しさん:2007/02/14(水) 11:51:52
% cat > test.pl
#!/usr/bin/perl
$ID = "id";
$PASS = "pass";
__END__

perlと余り関係ない質問かもしれませんが..
上の様なスクリプトを作った場合ファイルを開くと$PASSの「pass」が丸見えに
なるのですがこの部分を暗号化してわからないようにしてスクリプト実行時に
何らかの処理をして$PASSをpassに戻すような事は可能でしょうか?

663デフォルトの名無しさん:2007/02/14(水) 12:01:30
なんらかの処理をしてpassに戻ったら意味がないだろうが
SHA-1とかでハッシュにしてそれを持ってるとよろし
664デフォルトの名無しさん:2007/02/14(水) 12:05:42
>>663
ありがとうございます
ぐぐってきます..(´・ω・)
665デフォルトの名無しさん:2007/02/14(水) 13:30:21
音声入力でPerlスクリプトを書ける時代はいつになったら来るのかね
ttp://www.youtube.com/watch?v=KyLqUf4cdwc
666デフォルトの名無しさん:2007/02/14(水) 14:08:49
>>665
なんか失敗ばっかりしているように見えるね。
667デフォルトの名無しさん:2007/02/14(水) 14:35:28
>>665
warata
668デフォルトの名無しさん:2007/02/14(水) 14:45:30
>>665
やべえ面白すぎるwww
669デフォルトの名無しさん:2007/02/14(水) 15:29:03
SMTPを使わず/usr/lib/sendmail等から送る場合sendmailをパイプでopenする
手法がよく使われていますがこれらを実現出来るCPANに登録されているスタンダードな
モジュール名を教えていただけませんでしょうか。
670デフォルトの名無しさん:2007/02/14(水) 15:39:30
途中で手入力してるしw
開発部署のあちこちのデスクから、こんなん聞こえてきたらコエー。
671デフォルトの名無しさん:2007/02/14(水) 15:56:45
>>669
search.cpan.orgでsendmailをキーワードに検索すればいくつか出てくるので
適当に好きなのを使えばいいんじゃないか。
672デフォルトの名無しさん:2007/02/14(水) 20:43:09
>>665
この後に、オフィスPCに切れて投げ壊してる外人おっさんの動画を
673デフォルトの名無しさん:2007/02/14(水) 21:31:26
>>665
That was eazy.txt
ワロス
674デフォルトの名無しさん:2007/02/14(水) 21:57:07
Thank you って言ったらそれまで入ってもうて、必死で消してるw
675デフォルトの名無しさん:2007/02/14(水) 22:00:56
Undoできないのかな
676デフォルトの名無しさん:2007/02/14(水) 22:03:04
5分もかかってまだ open ( INFO しか入力できてねぇしw
677デフォルトの名無しさん:2007/02/14(水) 22:12:07
いや、INFO は結局入力できず手で入れてたし。
678デフォルトの名無しさん:2007/02/14(水) 22:39:15
検索結果を表示させるだけのものなんですが、大文字小文字の区別がつきません
297 if ( $line =~ /\Q$in{$form1}\E/ ) {
を   if ( $line =~ i/\Q$in{$form1}\E/ ) {  にするとエラーが出てしまいます

syntax error at test.cgi line 297, near "$in{"
syntax error at test.cgi line 297, near "/ )"
syntax error at test.cgi line 300, near "}"
Execution of test.cgi aborted due to compilation errors.

292 sub umu1 {
293 open(IN,"$file"); #csv読み込み
294 while(1) {
294 $line = <IN>; #csvの行を&lineに代入
295 @data = split( /,/ ,$line ); #@data[0~]にcsv行を個別に代入
296 if ( $line eq "" ) { last; } #無限ループ終了条件
297 if ( $line =~ /\Q$in{$form1}\E/ ) {
298 print "$data[0]$data[1]"."<br>"."\n";
299 }
300 }
301 close(IN);
302 }
679678:2007/02/14(水) 23:04:54
自己解決しました。なんともお粗末なミスで・・・
680デフォルトの名無しさん:2007/02/15(木) 00:37:59
WWW::Mechanizeを使用しているのですが、RecIE(http://www.h7.dion.ne.jp/~umiumi/)
のように、IEにhtmlの内容を表示させながらhtml解析する方法ってないでしょうか?
今はcontentで一旦ファイルに保存して、systemでIEを起動させ表示させています。
681デフォルトの名無しさん:2007/02/15(木) 10:04:00
sub foo {
処理
return(@A,@B,@C)
}

としている関数で、
(@A,@B,@C) = &foo()
↑のような感じで返り値を配列個別に受け取りたいんですが、
Perlでは可能なんでしょうか?
682デフォルトの名無しさん:2007/02/15(木) 10:16:08
sub foo {
hoge;
return \(@A, @B, @C);
}

($refA, $refB, $refC) = foo;

こういう感じにリファレンス渡しにしないといけない。
683デフォルトの名無しさん:2007/02/15(木) 11:20:31
>>680
Win32OLE
JavaScriptみたいなタグの分解も一緒にやってくれる
684デフォルトの名無しさん:2007/02/16(金) 04:43:05
Win32::GUIのListviewで行ごとに色を変えるにはどうしたらよいでしょうか?
685デフォルトの名無しさん:2007/02/16(金) 14:44:56
>>684
カスタムドローかオーナードロー
ってかWinAPI使うならCとかC++のが断然楽だぞ?
686デフォルトの名無しさん:2007/02/16(金) 17:14:27
>>685
カスタムロードがいいみたいですね。
Perlのサンプルコードはぜんぜんないようで。。。
困った
687デフォルトの名無しさん:2007/02/16(金) 17:21:16
ドロー
688デフォルトの名無しさん:2007/02/16(金) 17:36:30
>>686
Win32::GUIって自分でウィンドウメッセージ取れないのか?
取れるならC,C++のサンプルコードと同じようにできるが
できないなら知らん
689デフォルトの名無しさん:2007/02/16(金) 19:01:28
http://perl-win32-gui.sourceforge.net/cgi-bin/wiki.cgi?Change_Listview_Item_Color

サンプルコードは一応あるんだが、エラーが出て動かん。
カスタムドローの構造が古いのかな???
バイナリをいろいろ変換してるがよう分からんわ。
690デフォルトの名無しさん:2007/02/17(土) 15:11:52
>>689
substr( $lParam, 48, 8, $clrText);

substr(unpack("P56", pack("L",$lParam)), 48, 8, $clrText);
にするとエラーは無くなるが、文字色は変わらない。

要するに、$lParamはNMLVCUSTOMDRAW構造体へのポインタ
cf. http://www.kumei.ne.jp/c_lang/sdk3/sdk_261.htm
であって、この構造体の中身を書き換えればいいように思えるのだが、
Perl でどうすればいいのかわからない。
691デフォルトの名無しさん:2007/02/18(日) 17:54:02
CUIサーバープログラムで裏で1秒ごとにデータファイルを読み込みながら
クライアントにその時々の最新データを返すにはどのようにすればいいのでしょうか?

&readdata
sub readdata{

  after(1000,&readdata);
}
692デフォルトの名無しさん:2007/02/18(日) 17:55:11
Tkで使うafterのようなものがあるのでしょうか?
ということの説明のためにコードを書いていたのですが、途中で投稿してしまいましたorz

693デフォルトの名無しさん:2007/02/18(日) 19:55:10
sleep(1)
694デフォルトの名無しさん:2007/02/18(日) 20:26:34
ある数値が何行にもわたって書いてあるいくつかのテキストを読み込んで
指定した列の数値の平均を割り出すプログラムをperlで作りたいんですが
どのように作ればいいんでしょうか?
入門サイトなどをいくつか見てきましたが
これといったお手本が無く、行き詰まってしまいました。
お願いします。
695デフォルトの名無しさん:2007/02/18(日) 20:47:41
>>694
もちっとデータに具体性を出してほしい
例を上げて
696デフォルトの名無しさん:2007/02/18(日) 20:56:22
>>695
レスありがとうございます。
例というか、実際に使うテキストファイルの最初の5行をそのままコピペしますが

0; 133.44; 3180
1; 134.76; 3180
2; 168.35; 3180
3; 141.58; 3180
4; 157.86; 3180
5; 176.92; 3180

こうなってます。
一番左は列数、二列目が平均値を出したいデータ、三列目は無視してください。
二列目の数値の平均値が出したいのです。
ひとつのテキストファイルに44640行、
こんな感じの数値がずらずらと並んでいるので
二列目の数値を全部足して44640で割る、ということがしたいんです。
697デフォルトの名無しさん:2007/02/18(日) 21:11:30
とりあえず
・ファイルをperlに読み込んで各行をループさせる
・一行の中で、2列目の数値を取り出す
といった操作が必要だけど、
ファイルの読み書きや、正規表現とか、まったく何も分からないの?
698デフォルトの名無しさん:2007/02/18(日) 22:01:45
>>694
ちょうど最近それっぽい記事が出てた。
ttp://codezine.jp/a/article/aid/904.aspx
区切り記号が「,」か「;」の違いがあるとか微妙にちがうけど、
コレが理解できれば希望のスクリプトを書くのも出来るはず。
コピペだけですませようとしてるんなら無理だけど。
699デフォルトの名無しさん:2007/02/18(日) 22:02:02
>>697
一応、基礎的なことはサイトを見て勉強してきたんで
正規表現のことや
ファイルを読み込んでコマンドプロンプトに内容を表示させたり
ファイルの作成、書き込みなどは理解しているつもりです。
ただそれらのことを組み合わせてプログラムを作るとなると
まだよくわからないんです。
もう明日中には完成させなきゃならないんで
できればヒントだけでもお願いしたいです…
700デフォルトの名無しさん:2007/02/18(日) 22:08:59
こんな感じじゃね?試してないけど。

my $sum = 0;
my $i = 0;
for my $file (qw(unko1.txt unko2.txt)) {
 open my $fh, $file or die "開けん";
 while(<$fh>) { $sum += (/;\s*(-?\d\.\d);/)[0]; $i++; }
}
print "阿部怜治:", $sum / $i, $/;
701694:2007/02/18(日) 23:30:17
>>698.700
ありがとうございます。
もう少し頑張って明日試してみます。
702デフォルトの名無しさん:2007/02/19(月) 00:43:52
じゃ模範的なperlで
perl -pae "$l++;$s+=$F[1]}{$_=$s/$l" input.txt
703デフォルトの名無しさん:2007/02/19(月) 00:58:40
perl -F";" -lane '$t+=$F[1]; END{print $t/$.}' input.txt
704デフォルトの名無しさん:2007/02/19(月) 04:15:19
>>702
$F[1]}{

}{
って何してるの?
705デフォルトの名無しさん:2007/02/19(月) 04:59:09
>>704
$ perl -h
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed

-p は while (<>) { ... print; } で囲まれる。
706デフォルトの名無しさん:2007/02/19(月) 05:26:43
挙動的に同じって意味だと思ってたら、
本当にプリプロセッサのように囲まれるのね
707デフォルトの名無しさん:2007/02/19(月) 18:41:27
if ($a) { print $a; }
この書き方と

print $a if $a;
この書き方では何か違いはあるのでしょうか
708デフォルトの名無しさん:2007/02/19(月) 18:44:48
見た目
709デフォルトの名無しさん:2007/02/19(月) 20:24:07
すいません、質問です。
大体5万行くらいの大きさのテキストファイルから、
重複している行
(連続して重複してるわけでは無く、内容が同じ行が
とびとびに存在してる)を一つのこして、残りは省く
というスクリプトを書く場合、
1)1行目はそのまま書き出す
2)2行目は1行目と比較して、同じだったら書き出さない、違ったら書き出す
3)3行目は1行目と比較して、同じだったら書き出さない、違ったら2行目と比較して、、、
4)以下繰り替えし

このようなスクリプトしか無いのでしょうか?
処理に非常に時間がかかるので、何か良い方法があったら、御教示下さい。
710デフォルトの名無しさん:2007/02/19(月) 20:31:36
>>709
「perl 重複」でぐぐればいろいろテクニックが見つかる
711デフォルトの名無しさん:2007/02/19(月) 20:36:03
>>709
5万行くらいなら全部ハッシュテーブルに詰め込んでも大丈夫そうだが

順序崩していいならソートしてから重複を除くのがいいだろう
712 ◆TWARamEjuA :2007/02/19(月) 20:38:10 BE:2613683-2BP(6811)
1. 1行目の内容をハシュのキーに詰め込む。
while (<$fh>) {
 $hash{$_} = 1;

2. 読み込みが終わったら、keyを書き出す。
 print for keys %hash;


1-1. 読み込んだ順に書き出したい時。
my $line;
while (<$fh>) {
 $hash{$_} = [$_, ++$line];

1-2. 先に読み込んだ方を有効にしたい時。
 $hash{$_} = [$_, ++$line] unless $hash{$_} ;

2-1. 読み込みが終わったら、sortしながらkeyを書き出す。
 print for sort $hash{$a}->[1] <=> $hash{$b}->[1], keys %hash;

脳内妄想なので、補完よろしこ(照)
713 ◆TWARamEjuA :2007/02/19(月) 20:39:43 BE:1742382-2BP(6811)
ん、、、リファレンスにしなくても良かったか(呆)
714709:2007/02/19(月) 20:42:52
>>710-712
ありがとうございます。ハッシュテーブルを使う方法は、
全く考えてませんでした(というか今迄使ったことが無かったので)

とりあえず、ハッシュテーブルの使い方を勉強してきます。
715デフォルトの名無しさん:2007/02/19(月) 20:57:05
perl -ne 'print if not $seen{$_}++;'
でいいだろ。

メモリ足りないようならtie()使ってDBMファイルをワークに使えばよし。
716デフォルトの名無しさん:2007/02/19(月) 20:58:32
Perl やっててハッシュを使ったことが無いとな
717デフォルトの名無しさん:2007/02/19(月) 22:07:13
今までperlやってなかったんだろ
718デフォルトの名無しさん:2007/02/19(月) 22:16:49
無名(?)のBLOCKで、
{} ←中身が空だとエラーになるんだけど、素のBLOCKは使ってもいいのか、
使えるが推奨されてないのか、perl的でないのか、どんな感じなんでしょう?
719デフォルトの名無しさん:2007/02/19(月) 22:28:43
WindowsでNMAKEが必要なモジュールのインストールについて質問。
Windows2000では問題がなかったのに、vistaになってDBIとかがインストールに失敗する。
どうすれば回避できる?
720デフォルトの名無しさん:2007/02/19(月) 22:41:06
>>719
そのエラーメッセージで言われてるところを直せばインストールできるんじゃないか
721デフォルトの名無しさん:2007/02/19(月) 22:46:44
>>718
$hoge = {};
何か見えてこないかい?

それからperlrefのMaking Referencesの3番辺りに目を通すといいと良いかと。
…スクリプティング言語資料室さんの訳、そこの所間違ってるかな
> 一方、ハッシュではなくBLOCKへのリファレンスを返すのであれば、
722718:2007/02/19(月) 23:08:43
>>721
おー、ありがとう。丁度良い書き方が見つかりました。

{}だけ書いて中身は後で書きたいときに、エラーになるのが気持ち悪かったのですが、
{;}という方法があったか!
723デフォルトの名無しさん:2007/02/20(火) 16:33:08
最近対策済みのスパムに漏れて書き込みが散見されるので
if ($comment !~ /(\x82[\x9F-\xF2])|(\x83[\x40-\x96])/) {&er_("cannot write!","1");}

ここを変えたいと思います。
ここをひらがなの「あ」〜「ん」が含まれていなければ、という意味にしたいのですが、

「あ」は 82A0
「ん」は 82F1 です。

(\x82[\x9F-\xF2])|(\x83[\x40-\x96])
これをどう治せばいいのでしょうか?

↑正規表現とマッチングを理解していないので、
これのはっきりとした意味がわかっていません。
たぶんカタカナまで含まれていると思うのですが・・。
724デフォルトの名無しさん:2007/02/20(火) 16:51:19
>>723
sjisか。
| の左側がひらがなで、右側がカタカナでしょ。
ひらがなだけよけたいなら、

$comment !~ /\x82[\x9F-\xF1]/

でいいんじゃね?
725723:2007/02/20(火) 17:04:41
>>724
ありがとうございます。
ひらがなのみのフィルタで無事動きました。
726中の人:2007/02/21(水) 00:01:39
>>721
すまん確認した。
どこをどうすればこういう勘違いをするんだかわれながら不思議だ。

つーことで今週末までをめどに修正しておきます。
727デフォルトの名無しさん:2007/02/21(水) 21:57:48
なるほどねぇ
728688:2007/02/21(水) 22:09:52
>>690
自己解決しました。

my $CopyMemory=new Win32::API("kernel32", "RtlMoveMemory", "NPI", "V");
defined $CopyMemory or die "Cant find CopyMemory";

$CopyMemory->Call($lParam+48, $clrText, 8);
729デフォルトの名無しさん:2007/02/21(水) 22:18:46
>>728
訂正688→686
730デフォルトの名無しさん:2007/02/21(水) 23:31:13
>>728
substr( $lParam, 48, 8, $clrText);

$object->TextColor( (unpack('II',$clrText))[1] );
$object->TextBkColor( (unpack('II',$clrText))[0] );
にする方が楽だと思うけど、自己解決おめでと。
731686:2007/02/22(木) 00:45:28
>>730
それじゃ、Selectすると全部色変わっちまうぜよ。
732690:2007/02/22(木) 01:35:07
>>728
自己解決おめでとう。
>>689
substr( $lParam, 48, 8, $clrText);
の意味について考え直したのだが、以前のバージョンのActivePerl では
「裏仕様」として、「$lParam がポインタと考えられる場合は、間接指定
されたアドレスの文字列(バイト列)を操作し、そうでなければ$lParam
そのものを操作する」というのがあったのではないだろうか。
>>689 のソースを読む限り、そうとしか思えない。
 ところが、この「裏仕様」は危険であるし、安全確実な間接アドレス指定方法
が手当てされたから、いつかのバージョンで廃止されたんだろうね。
733デフォルトの名無しさん:2007/02/22(木) 16:07:47
if( $ENV{REMOTE_ADDR} eq ’’ )
ってありえるのでしょうか?
734デフォルトの名無しさん:2007/02/22(木) 16:26:33
>>733
CGIとかで動かしてるなら鯖の仕様次第だし
普通にコマンドラインから実行すれば空になる
735デフォルトの名無しさん:2007/02/22(木) 19:59:42
$comment に http の文字が5つ以上あるとエラーを出したいのですが、
正規表現でのチェックはどうすればいいのでしょうか?

if( $comment /~ (.*http.*http.*http,*http,*http) ) { error(); }

こんな感じでしょうか?orz
736デフォルトの名無しさん:2007/02/22(木) 20:46:31
if ($comment =~ /(.*http){5}/s) { error(); }
737 ◆TWARamEjuA :2007/02/22(木) 21:22:57 BE:5227968-2BP(6811)
print "error" if $comment =~ /http/g > 4;
 だめだった。。。

print "error" if scalar @{[$comment =~ /http/g]} > 4;
 桶だった。。。

詳しい人の解説キボンヌ(照)
738脱帽:2007/02/22(木) 21:26:24
スカラーだと真か偽しか返さないから
739脱帽:2007/02/22(木) 21:27:58
スカラーの場合は真か偽しか返さないからじゃ
740デフォルトの名無しさん:2007/02/22(木) 21:44:26
スカラーコンテキストでマッチした数が返ってくるのは置換の s///g の場合。
なので、もしそういう風に書きたいのなら

print "error" if $comment =~ s/http/http/g > 4;

とか書くといいかも。
741デフォルトの名無しさん:2007/02/22(木) 22:04:23
なるほどねぇ
742735:2007/02/22(木) 22:24:08
if($comment =~ s/http/http/g > 4){ &er_('cannot write!');}
これでいけました。

s/hogehoge/fugafuga/gの s と g の意味がわからなかったのですが、
調べて理解できました、ありがとうございます。
743デフォルトの名無しさん:2007/02/23(金) 13:36:53
WindowsXP + ActivePerl 5.8.8 build 820 です
こちらは初めてです、29箱目ということで既出質問だったらすみません

上記環境で モジュール Encode が threads と同時に上手く働きません
perl素人の自分なりに調べた結果、Encode モジュールはスレッドセーフでは
ないのではないかと思い始めたのですが、それで間違いないでしょうか?
それとも私が何か大事なお約束や呪文を忘れているのでしょうか

また、スレッドセーフで無かった場合、各スレッド内で文字コード変換を
行いたい場合、皆さんはどのようにしているでしょうか
744デフォルトの名無しさん:2007/02/23(金) 14:04:52
>>743
適当にぐぐったらこういうのがあった。

ttp://www.nntp.perl.org/group/perl.perl5.porters/2007/02/msg120729.html

確かに試すとたまにおかしな結果になる。ちなみに手元のバージョンは
v5.8.8 built for i486-linux-gnu-thread-multiだった。

マニュアル見てもthread-safeであるとは書いてないし、原則は明記されて
なければunsafeと思えだから間違ってはいないのだろう。

で、俺はスレッドでEncode使った経験はないからなんともいえないのだが、
普通に考えたら適当なshared variableでlockかけてから使うぐらいしか
ないのではないだろうか。
745743:2007/02/23(金) 14:22:08
>>744 返信ありがとうございます

確実に再現性のある最小コードを続いて投稿…と思ったのですが上手くいかずorz
自分の考え違いだったかもと思っていたところでした

URL 先のコードを試した結果、私の環境でもおかしな結果を不規則に起こしました

再入しないようにとりあえず自衛していく方向でいってみます
ありがとうございました
746743:2007/02/23(金) 16:42:34
他のモジュール内でもEncode使っているのが多くありそうですね

PerlIO layer での :encoding(〜) とか
HTTP::Message の decoded_content とか便利だなーとガシガシ使っていたので
どんどん泥沼のソースになっていきましたorz
747デフォルトの名無しさん:2007/02/23(金) 16:45:17
よく使われる奴はthread safeにして欲しいね
748デフォルトの名無しさん:2007/02/23(金) 22:14:02
小飼氏(メーリングリスト)に投げてみたらいいんじゃないかな。
つーか投げてほしい。
749デフォルトの名無しさん:2007/02/23(金) 22:54:10
blogの感じからするとすごく暇そうなので「直せやおら」とか言うといいんじゃね?>Encode
メーリングリストはJcodeメーリングリストでok
750デフォルトの名無しさん:2007/02/24(土) 02:14:26
あのヒゲモジャのことだからギブミーpatchでかえされるに200ペソ
751デフォルトの名無しさん:2007/02/24(土) 11:03:22
それはひどい>ギブミーpatch
752デフォルトの名無しさん:2007/02/24(土) 13:51:21
なんの解決にもならないw>ギブミーpatch
753デフォルトの名無しさん:2007/02/24(土) 14:57:03
>>751-752
なにが「ひどく」て「解決にならない」なの?
ライセンスがArtisticとGNU GPLのデュアルライセンスで、
どっちもソースが公開されているものなんだから不具合あったらソースを追って自分で改変するくらい当たり前じゃん。
おまえらはフリーライダーなの?それともそれをやるだけの能力がない低脳なの?
754デフォルトの名無しさん:2007/02/24(土) 15:28:14
これは酷い混じれ酢だ
755デフォルトの名無しさん:2007/02/24(土) 17:43:38
少なくとも小飼氏よりは低能間違い無しです><
756デフォルトの名無しさん:2007/02/24(土) 20:38:11
patchが作れるなら人に頼らないしメールも送らないってば。
757デフォルトの名無しさん:2007/02/24(土) 20:55:47
「ギブミーpatch」といわれたら、「無理!」って返事すればいいだけ。

キラクニヤレヤ〜♪
758デフォルトの名無しさん:2007/02/24(土) 22:05:02
(´・ω・)
759デフォルトの名無しさん:2007/02/24(土) 23:26:36
質問です。
浮動小数点計算をループでしていてその結果を出力したら、
あるタイミングから#INDというのが出力されました。
これは一体なんでしょうか、、、
760デフォルトの名無しさん:2007/02/24(土) 23:35:56
不定値(正負の無限大 or NaN)
0除算してるんじゃね?
761デフォルトの名無しさん:2007/02/24(土) 23:48:49
>>760
レスありがとうございます。
数値扱いされてないのでしょうか?
具体的なコードはこんなかんじなんですが、、


my $a = -0.1382 ** 0.000212494687632809;
my $temp = -0.1382;
my $b = $temp ** 0.000212494687632809;

これだと$aはちゃんと出力されるんですが、$bは-1.#INDと出力されます。。
762デフォルトの名無しさん:2007/02/25(日) 00:11:04
>>759
indefinite
763デフォルトの名無しさん:2007/02/25(日) 00:27:05
>>761
"**"は"-"より強いので
-0.1382 ** 0.000212494687632809

-(0.1382 ** 0.000212494687632809)に等しい。
764デフォルトの名無しさん:2007/02/25(日) 01:53:36
>>761
Math::BigFloat
765デフォルトの名無しさん:2007/02/25(日) 02:10:48
>>762
>>763
>>764
レスありがとうございます。明日にでも試してみたいと思います。
766デフォルトの名無しさん:2007/02/25(日) 12:00:00
(´・ω・)12時
767デフォルトの名無しさん:2007/02/25(日) 19:23:35
(´・ω・)時報スクリプトを作ってみました..

#!/usr/bin/perl
use WWW::Mechanize;
$mech = WWW::Mechanize->new(agent => 'Mozilla/4.0 (MSIE 6.0;)');
while(1){
my(@t) = localtime(time);
unless( $t[1] == 59 && $t[0] > 20){sleep(30);next;}
$mech->get($ARGV[0]);
$mech->field("MESSAGE" => "時報");
$mech->click();
(@t) = localtime(time);
sleep(60-$t[0]);
$mech->click();
}
768デフォルトの名無しさん:2007/02/27(火) 20:41:51
日本語PDF作るモジュールのお薦めってありますか?
PDFJ?
769デフォルトの名無しさん:2007/02/27(火) 22:40:04
PDFJ
770デフォルトの名無しさん:2007/02/28(水) 00:10:35
$input=<STDIN>;
$input=~s/\n//;

print "$input";

コマンドラインから「\n\n」と入力した場合に
「\n\n」と出力されるのではなく、改行2個が出力されるようにしたいんですが
どうすればいいですか?
771デフォルトの名無しさん:2007/02/28(水) 00:17:23
自力でs/\\n/\n/g;とするかevalするか
772デフォルトの名無しさん:2007/02/28(水) 00:24:39
>>771
わかりました。ありがとうございます。
773デフォルトの名無しさん:2007/02/28(水) 00:52:29
>>771,772
evalは安易に使うとコマンド実行も出来ちゃうので正規表現にしとけ。
どうしてもeval使う場合は入力チェックしないと危険よ
774770:2007/02/28(水) 01:14:01
>>773
アドバイスありがとうございます。
自分でちょっとしたテキスト処理をやりたいだけなので大丈夫です。
\< や \/ や \. などの入力が入った場合、その都度
s/\\\</\</;
s/\\\./\./;
を書かなければいけないのでevalにします。ありがとうございました。
775768:2007/02/28(水) 13:05:37
>769 サンクス。
自由度がありすぎて面倒な部分もあるんだけど、
やっぱPDFJでいってみます。

776デフォルトの名無しさん:2007/02/28(水) 16:35:41
質問です 頓珍漢だった笑ってください

perlはCの #include に相当する機能はあるのでしょうか?

今、Perlで統計解析の処理をしています。解析手法ごとに異なったスクリプト
を作っています。

入出力部分が複雑なんでここの部分と全体で使える共通サブルーチンだけ切り出して
別ソースにして、実行時に組み込んで使いたいのですが、どうも旨くゆきません。

ぐぐったりしてみましたが、Use、Requireの話しか検索できません。何か単純に
Includeする方法は無いのでしょうか?


777デフォルトの名無しさん:2007/02/28(水) 16:48:38
>>776
そう難しくないからモジュールにしてuse使うべきだな。
778デフォルトの名無しさん:2007/02/28(水) 16:48:43
  ァ  ∧_∧ ァ,、
 ,、'` ( ´∀`) ,、'`
  '`  ( ⊃ ⊂)  '`
779デフォルトの名無しさん:2007/02/28(水) 16:49:14
 ははは      
   ∧_∧                もうダメ      
   ( ´∀`)                 ∧_∧          モウ カンベン
.  ( つ ⊂ )     ヒヒヒヒ         (´∀` ,,)、 あははは    シテクダサイ
   .)  ) )  ○   ∧_∧ ,     , へ,, へ⊂),    ∧_∧ ○,
  (__)_)⊂ ´⌒つ´∀` )つ   (_(__)_丿  ⊂(´∀`⊂ ⌒ヽつ
780デフォルトの名無しさん:2007/02/28(水) 16:52:53
requireで問題なくできそうだけど駄目なんかな
781デフォルトの名無しさん:2007/02/28(水) 17:02:56
目線を高くしてオブジェクト指向にしたらどうだ?
782デフォルトの名無しさん:2007/02/28(水) 17:07:13
776はrequireやuseの説明を読んでないのではないのでは?
includeとスペルが違うからって脊髄反射したのか?
そうでないのなら、ますはrequireでは駄目だった点を質問文につけないと回答者は答えようがないぞ
783デフォルトの名無しさん:2007/02/28(水) 17:08:32
すまん
×776はrequireやuseの説明を読んでないのではないのでは?
○776はrequireやuseの説明を読んでないのでは?
784デフォルトの名無しさん:2007/02/28(水) 17:11:40
名前空間の問題とかあるし、普通にモジュール作るのがいいと
思うけどな。よほどこったことやるんじゃなけりゃ、Exporter
使えば一発だし。
785デフォルトの名無しさん:2007/02/28(水) 17:14:16
>>776は最後に1;を入れ忘れてると見た
786笑われた 776:2007/02/28(水) 17:22:05
すみません確かにRequireに関して真面目に読んでいないです

Cの#includeのつもりだったので、

------------ 今まで ------------

初期の宣言など・・・

open(FP, $filename) or die($filename);

while(<FP>) {
$hash{$key} = hoge;
}


------------ 変更 ------------


初期の宣言など・・・

require 'other.pl';

&sub($filename, \%hash);


と変更しただけなんですが・・・・実行時に

787デフォルトの名無しさん:2007/02/28(水) 17:25:10
ワッフルワッフル!!
788デフォルトの名無しさん:2007/02/28(水) 23:16:02
単純に定数の扱いがやっかいかな。perlは。
789デフォルトの名無しさん:2007/03/01(木) 01:53:41
use constant FOO => 'bar';

use Readonly;
Readonly my $HOGE => 'fuga';

こういうのでいいじゃん。
790デフォルトの名無しさん:2007/03/01(木) 08:05:44
PerlでCPANによるモジュールのインストールが失敗します。
install LWP::Simple
....
BEGIN failed--compilation aborted at /System/Library/Perl/Extras/5.8.6/darwin-thread-multi-2level/HTML/TokeParser.pm line 12.
Compilation failed in require at ../blib/lib/HTML/Form.pm line 116.
html/form-param.......dubious
Test returned status 2 (wstat 512, 0x200)
DIED. FAILED tests 1-24
Failed 24/24 tests, 0.00% okay
....

どなたかお助けを。
環境:MacOS X 10.4 Tiger, perl 5.8.6
791デフォルトの名無しさん:2007/03/01(木) 16:35:18
正規表現?に関する質問です。
条件文 $Fm{"data"} !~ /^[0-9]/ の意味は ”0〜9以外の文字を含まない場合”ですが
これを”0〜9と半角カンマ「,」以外の文字を含まない場合”という条件文にしたいです。
どう書けばいいんでしょうか(´・ω・`)??
792デフォルトの名無しさん:2007/03/01(木) 16:55:20
>>791
”0〜9と半角カンマ「,」以外の文字を含まない場合”
→”0〜9と半角カンマ「,」のみを含む場合”
$Fm{"data"} =~ /^[0-9,]*$/ # NULLもマッチ
あるいは $Fm{"data"} =~ /^[0-9,]+$/ # NULLはマッチしない
793デフォルトの名無しさん:2007/03/01(木) 17:01:19
>>792
レスありがとう。なるほど(´・ω・`)
794 ◆TWARamEjuA :2007/03/01(木) 21:13:38 BE:1525627-2BP(6811)
>>790
cpan> install LWP::Simple
LWP::Simple is up to date.

(゚∀゚)アヒャ

MacOS X 10.4.8
$ perl -v
This is perl, v5.8.6 built for darwin-thread-multi-2level
(with 3 registered patches, see perl -V for more detail)
ほいほい・・・
Locally applied patches:
23953 - fix for File::Path::rmtree CAN-2004-0452 security issue
33990 - fix for setuid perl security issues
SPRINTF0 - fixes for sprintf formatting issues - CVE-2005-3962
795791:2007/03/02(金) 01:52:03
>>792
すいません、おそらくマッチングはしてるっぽいんですが、その後
$Fm{'data'}の中身の半角カンマが全角カンマに変わってました。
これは何故なんでしょう?
796デフォルトの名無しさん:2007/03/02(金) 02:03:58
そんな莫迦なことがあるか
797791:2007/03/02(金) 02:09:50
ちなみに$Fm{'data'}というのはテキストボックス
&input('text','data',"$up",' size=50',"\n");
の入力値です。
798791:2007/03/02(金) 02:23:03
あ、 &inputは
sub input {
$label++;
print qq|<LABEL for="$label$_[1]">\n|;
print qq|<INPUT type="$_[0]" name="$_[1]" id="$label$_[1]" value="$_[2]"$_[3]>$_[4]\n|;
print qq|</LABEL>\n|;
}
となっております。
799デフォルトの名無しさん:2007/03/02(金) 07:19:02
「してるっぽい」ってなんだよ。プログラムなんだからしてるかしてないか
どっちかしかないので、きちんと確認してから質問しろ。

問題の切り分けができてなくて的外れな質問を垂れ流している予感。
800デフォルトの名無しさん:2007/03/02(金) 08:40:49
そして質問内容がWeborogの範疇に…
801デフォルトの名無しさん:2007/03/02(金) 09:45:17
どっかで置換してんだろ
802デフォルトの名無しさん:2007/03/02(金) 12:13:48
LWP::UserAgent を使って、https のコンテンツを「Proxy経由」で取得する場合は、
================================================
use LWP::UserAgent;
$ENV{HTTPS_PROXY} = "http://〜proxy〜:〜port〜/";
my $proxy_url = "http://〜proxy〜:〜port〜/";
my $url = "https://〜URL〜";

my $ua = LWP::UserAgent->new();
$ua->proxy(qw( http https ), $proxy_url);
# $ua->proxy(['http', 'https'], $proxy_url); --> これでも同様

my $response = $ua->get($url);
print $response->content;
================================================
で問題が無く取得できるのですが、
URLが"http://〜"の場合には、Proxyサーバから
「サポートされていないリクエスト/プロトコルです」
というエラーが出てしまいます。

「perldoc Crypt::SSLeay」に記載されている
$ua->proxy([qw( https http )], "$proxy_ip:$proxy_port");
では、Proxyサーバから上と同様のエラーが。しかしこの場合、URLが"http://〜"ならOK。

また、http と https を入替えてみると
($ua->proxy(qw( https http ), $proxy_url);)
今度は http がOKで https がエラー。

"http" "https" のどちらかしか認識してくれてないようなのですが、
どうすれば http, https とも取得できるようになりますでしょうか?
803802:2007/03/02(金) 12:15:02
ちなみに環境は以下です。
OS
Red Hat Enterprise Linux ES4
Squidバージョン
2.4.STABLE7
perlバージョン
5.8.5
その他モジュール
Crypt-SSLeay-0.53 , openssl-0.9.7a-43.10
804デフォルトの名無しさん:2007/03/02(金) 13:29:18
squidはhttpsをproxyするときにCONNECTメソッドを使うやり方を期待している
ので、LWP::UserAgentのproxyの仕組みではだめでCrypt::SSLeayの方のを
使う必要がある。したがって、$ua->proxyでhttpsのproxyを設定せずに、
環境変数HTTPS_PROXYを設定するのが正解。また、HTTPS_PROXYの設定は
末尾に'/'があるとエラーになる。

たぶん以下の2行を修正すれば動くと思う。(俺の手元では動いた)

$ENV{HTTPS_PROXY} = "http://〜proxy〜:〜port〜"; # 末尾の/をとる

$ua->proxy(qw( http ), $proxy_url); # httpsは指定しない
805802:2007/03/02(金) 16:10:21
> 804
バッチリいけました。ありがとう!
806デフォルトの名無しさん:2007/03/02(金) 21:38:01
PATH_INFOをHTMLに出力する場合、以下のエスケープ方法で大丈夫でしょうか。
$path = $ENV{'PATH_INFO'};
$path =~ tr/+/ /;
$path =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$print_path = $path;
$print_path =~ s/&/&/g;
$print_path =~ s/>/>/g;
$print_path =~ s/</</g;
$print_path =~ s/"/"/g;
$print_path =~ s/'/'/g;
print $print_path;
807デフォルトの名無しさん:2007/03/02(金) 22:08:28
>>806 ダメな上に板違い。
808806:2007/03/02(金) 22:26:19
orz
失礼しました。向こうに移動します。
809デフォルトの名無しさん:2007/03/02(金) 22:53:42
「$textにいくつかの文字列候補、例えばApp,Bbq,Ntk,Sunが2個以上含まれる時」
っていう条件はどう書けばいいの?
1つだと $text =~ /(App|Bbq|Ntk|Sun)/だけど・・・
810デフォルトの名無しさん:2007/03/02(金) 23:20:13
>>809 これでどうかな?
$text =~/(?:.*?(?!\1)(UnKO|CHiNKO|MaNKO)){2}/

性器表現の質問なら、専スレのがレベル高い回答を得られるかも。
811デフォルトの名無しさん:2007/03/02(金) 23:23:34
(scalar @{[$text =~ /App|Bbq|Ntk|Sun/g]} >= 2)
812デフォルトの名無しさん:2007/03/02(金) 23:32:18
あ、重複があってもいいのか。なら
/(?:.*?(UNKO|CHINKO|MANKO)){2}/
で十分。
813デフォルトの名無しさん:2007/03/02(金) 23:47:55
括弧に量指定子を使うのって何か気持ち悪い
814デフォルトの名無しさん:2007/03/03(土) 00:55:36
つ ?:
815デフォルトの名無しさん:2007/03/03(土) 12:26:36
>>809
my @str = qw( FooAppBarBbqBaz NtkQuuxSun Foo App BarBbqBaz);
for (@str) {
  print 1 if @{[ /App|Bbq|Ntk|Sun/g ]} >= 2; # >>811
  print 2 if s/(App|Bbq|Ntk|Sun)/$1/g >= 2;
  print 3 if @{[ split /App|Bbq|Ntk|Sun/, $_, 3 ]} >= 3;
  print 4 if /App|Bbq|Ntk|Sun/g && //g;
  print '/';
}
816デフォルトの名無しさん:2007/03/04(日) 01:01:58
WWW::Mechanizeのインストールをしたいのですが、
make test で以下のように失敗してしまいます。
何か原因はわかりますでしょうか? (OS:fedora core 5 / perl:v5.8.8)
-----------------------------------
# Failed test '404 check'
# at t/local/back.t line 149.
# got: '500'
# expected: '404'
t/local/back............ok 29/38# Looks like you failed 1 test of 38.
t/local/back............dubious
  Test returned status 1 (wstat 256, 0x100)
DIED. FAILED test 28
  Failed 1/38 tests, 97.37% okay (less 2 skipped tests: 35 okay, 92.11%)
-----------------------------------
817816:2007/03/04(日) 01:05:47
もともと開発環境が無かったので、yumでgcc make bison flex gcc-c++ gnupg をインストールしました。
他に足りないものがあったりしますか?
818デフォルトの名無しさん:2007/03/04(日) 01:07:36
足りないものは、エラーログを探して見てみようとする知恵。
819816:2007/03/04(日) 01:29:41
820デフォルトの名無しさん:2007/03/04(日) 03:55:51
for $i (0..100){
  $n = ($i)?1:0;
  ...
}

このコードの、1以上を全て1とする処理部分を
if文を無くして$n=bool($i)の様な感じでシンプルに
書く方法はあるでしょうか?
821デフォルトの名無しさん:2007/03/04(日) 04:29:07
$n = 0;
for $i (0..100) {
 ・・・
 $n = 1;
}
822820:2007/03/04(日) 05:18:01
>>821
ありがとうございます。
すみません、例が悪かったですね。。出直してきます λ...
823デフォルトの名無しさん:2007/03/04(日) 05:49:33
“シンプル”にという意味では関数以外ないはず
824デフォルトの名無しさん:2007/03/04(日) 10:17:41
まだ誰も指摘していないが「ゲーム脳」(これはガセらしいが)と同じような
障害で、「検索脳」というものが存在するようだ。>>819を見て確信した。

「ヒト」として機能していない。
825デフォルトの名無しさん:2007/03/04(日) 12:35:17
>>820
$n=!!$i; でいいんじゃね?
826デフォルトの名無しさん:2007/03/04(日) 18:53:02
それだと偽の場合に 0 じゃなくて空文字列になるような。
827デフォルトの名無しさん:2007/03/04(日) 19:14:04
$n=int!!$i;
828820:2007/03/05(月) 00:57:42
>>823 >>825-826
int!! でうまく置き換えできました。ありがとうございました。
829デフォルトの名無しさん:2007/03/05(月) 01:36:38
結局?0:1の方が短い件について
830デフォルトの名無しさん:2007/03/05(月) 01:51:05
それは言っちゃダメ
831デフォルトの名無しさん:2007/03/05(月) 03:29:48
条件分岐が無くなって算術演算だけになってるのがミソじゃまいか?
832デフォルトの名無しさん:2007/03/05(月) 03:30:47
reach!!
833デフォルトの名無しさん:2007/03/05(月) 03:52:55
内部では条件分岐起きまくりだろ・・・。常識的に考えて・・・。
三項演算子の方が間違いなく低コスト。
834デフォルトの名無しさん:2007/03/05(月) 07:40:09
int!!ってrubyかなんかかよ…気持ちわるい
835デフォルトの名無しさん:2007/03/05(月) 07:46:54
PerlがRubyに気持ち悪いとな?
836デフォルトの名無しさん:2007/03/05(月) 08:00:16
目糞鼻糞
837デフォルトの名無しさん:2007/03/05(月) 10:24:26
それはないだろ・・・常識的に考えて・・・。
838デフォルトの名無しさん:2007/03/05(月) 10:43:00
>>833
論よりベンチ。

use Benchmark;

timethese(undef, {
820 => sub {
for my $i (0..100) {
my $n = $i? 1: 0;
}
},
821 => sub {
my $n = 0;
for my $i (0..100) {
$n = 1;
}
},
827 => sub {
for my $i (0..100) {
my $n = int !! $i;
}
},
});

Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.07 usr + 0.01 sys = 3.08 CPU) @ 30756.17/s (n=94729)
821: 3 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 48809.49/s (n=154238)
827: 3 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 28888.54/s (n=90710)
839デフォルトの名無しさん:2007/03/05(月) 10:51:31
意外と差が無いな。
840デフォルトの名無しさん:2007/03/05(月) 11:05:07
820だけ$nがループの外でmyされてるので影響あるんじゃないか
という疑問があったのでとりなおしてみた。やっぱり影響あった
らしく820,827はやや速くなったまでは予想通りだが、820と827が
逆転したのはかなり不思議だ。誰か理由説明できる?

use Benchmark;

timethese(undef, {
820 => sub {
my $n;
for my $i (0..100) {
$n = $i? 1: 0;
}
},
821 => sub {
my $n = 0;
for my $i (0..100) {
$n = 1;
}
},
827 => sub {
my $n;
for my $i (0..100) {
$n = int !! $i;
}
},
});

Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 2 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 36769.75/s (n=115457)
821: 3 wallclock secs ( 3.05 usr + 0.00 sys = 3.05 CPU) @ 48989.51/s (n=149418)
827: 3 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 42848.40/s (n=133687)
841デフォルトの名無しさん:2007/03/05(月) 11:16:20
int!!のが速いな・・・。マジかよ・・・、信じられない。
俺のPCでも >>840 でやってみた。

Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 4 wallclock secs ( 3.10 usr + 0.04 sys = 3.14 CPU) @ 2998.73/s (n=9428)
821: 3 wallclock secs ( 3.03 usr + 0.00 sys = 3.03 CPU) @ 4186.78/s (n=12665)
827: 4 wallclock secs ( 3.06 usr + 0.00 sys = 3.06 CPU) @ 3838.45/s (n=11761)

なるほど。俺のPCの性能は>>840 のPCの1/10もないのか。
842デフォルトの名無しさん:2007/03/05(月) 11:23:02
ここにまた新しいトリビアが生まれた
843デフォルトの名無しさん:2007/03/05(月) 11:28:32
トリビア : >>840有するPC性能の1/10にも満たないPCを>>841は使っている。
844デフォルトの名無しさん:2007/03/05(月) 11:29:01
どうでもいいな。
845デフォルトの名無しさん:2007/03/05(月) 11:33:04
/usr/bin/perl -v
This is perl, v5.8.5 built for x86_64-linux-thread-multi
Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.09 usr + 0.00 sys = 3.09 CPU) @ 51378.64/s (n=158760)
821: 3 wallclock secs ( 3.03 usr + 0.00 sys = 3.03 CPU) @ 62582.84/s (n=189626)
827: 4 wallclock secs ( 3.11 usr + 0.00 sys = 3.11 CPU) @ 55434.73/s (n=172402)

/usr/local/bin/perl -v
This is perl, version 5.005_03 built for i686-linux
Benchmark: running 820, 821, 827, each for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 43505.98/s (n=130953)
821: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 51370.00/s (n=154110)
827: 3 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 30147.18/s (n=90743)

同一マシンで実行
int!!が2倍近く違う。
846デフォルトの名無しさん:2007/03/05(月) 11:40:54
シングルコアと、マルチコア。 条件分岐の影響が出てるということ?
847デフォルトの名無しさん:2007/03/05(月) 11:44:10
ここはソース解析するしかないな。な?↓
848デフォルトの名無しさん:2007/03/05(月) 11:53:29
それをCで書いて、そのコンパイル結果で比較するとかは無意味?
849デフォルトの名無しさん:2007/03/05(月) 11:54:41
毎回ベンチだと盛り上がるなw
850845:2007/03/05(月) 11:59:10
XEON(32bit)で実行
/usr/local/bin/perlは845と同じもの

/usr/bin/perl -v
This is perl, v5.8.0 built for i386-linux-thread-multi
Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.07 usr + 0.00 sys = 3.07 CPU) @ 37608.14/s (n=115457)
821: 3 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 45086.26/s (n=141120)
827: 4 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 41884.98/s (n=131100)

/usr/local/bin/perl -v
This is perl, version 5.005_03 built for i686-linux
Benchmark: running 820, 821, 827, each for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 44429.57/s (n=133733)
821: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 53565.33/s (n=160696)
827: 3 wallclock secs ( 3.01 usr + 0.02 sys = 3.03 CPU) @ 28967.00/s (n=87770)

5.0が遅いのか、i686が遅いのか、多分前者だろう。
851デフォルトの名無しさん:2007/03/05(月) 12:31:38
>>844
どうでもよくなかったらトリビアじゃないだろアホw
852デフォルトの名無しさん:2007/03/05(月) 13:33:05
数十倍も変わるならあれだがね
n<2倍なんて誤差の範囲だろ…馬鹿馬鹿しい
853デフォルトの名無しさん:2007/03/05(月) 15:31:15
測定してみなきゃわからない。
854デフォルトの名無しさん:2007/03/05(月) 15:47:48
実際にやってみた。
Benchmark: running 820, 821, 827, each for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 363.00/s (n=1089)
821: 4 wallclock secs ( 3.27 usr + 0.00 sys = 3.27 CPU) @ 395.64/s (n=1292)
827: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 249.67/s (n=749)
855デフォルトの名無しさん:2007/03/05(月) 16:17:10
Perl で、XMLファイルのパース可否(well-formed)をチェックするツールを作りたいのですが、
環境条件があって関連モジュール(XML::Simple、XML::Parser)を使用できません。
データの抽出とかは不要で、$!={0|1} だけがわかればいいのですが、
正規表現だけで作る方法がありましたら、教えてください。
856デフォルトの名無しさん:2007/03/05(月) 16:45:20
EBNFから正規表現を起こせばいいんじゃない?

http://www.w3.org/TR/xml11/
857デフォルトの名無しさん:2007/03/05(月) 17:05:42
俺の公言身長は、実測値の1.2倍。もちろん誤差の範囲だよな?
858デフォルトの名無しさん:2007/03/05(月) 17:06:26
>>856
ちょ、EBNFと正規表現じゃ受理できる言語のクラスが違いますがな。

もっとも何とかする方法はなくもない。

(1) ネストの段数を適当に有限に制限してがんばって展開する
(2) perl拡張の(??{ code })を使う
859デフォルトの名無しさん:2007/03/05(月) 17:08:52
ああ、再帰を使うのは当然だと思ったから書き忘れた
860デフォルトの名無しさん:2007/03/05(月) 17:30:43
モジュールがインストールされていなくても、
pmファイルをどっかから持ってきて一緒に置いとけば使えたりしないの?
ちゃんとインストールコマンド使って、CPANから入れなきゃダメ?
861デフォルトの名無しさん:2007/03/05(月) 17:35:35
ぐぐれ
862デフォルトの名無しさん:2007/03/06(火) 20:53:21
>>860
PurePerlモジュールならそれでいい。
つーか「モジュールを取ってきて適切なディレクトリにコピーする」という作業をインストールという。
863デフォルトの名無しさん:2007/03/06(火) 22:25:17
XML::TinyならPPだから使えると思う。
864デフォルトの名無しさん:2007/03/09(金) 10:24:45
単純な質問ですみまそん。
windowsのactive perl を使っているのですが、
ファイルの行数を数えるのは↓が最速でしょうか?もっといい方法はありますか?

open(FILE, "< filename");
$i++ while <FILE>;
close(FILE);
865デフォルトの名無しさん:2007/03/09(金) 10:49:35
ファイルが巨大なら `wc -l filename` とかした方が速いかもよ?
866デフォルトの名無しさん:2007/03/09(金) 10:56:54
wcってのはじめて見ました。ありがとん。

max1000行程度なんですが、ちと調べてみます。
867デフォルトの名無しさん:2007/03/09(金) 11:07:11
sysreadで丸呑みしてtrでカウントするのが早いかな。
1000行ほどじゃwc遅いけどもっとでかくなるとwcが爆速で笑える
868デフォルトの名無しさん:2007/03/09(金) 11:11:22
1000行ぐらいならどうやっても大差ないんじゃないかな。
それを10000回やるなら別だけどさ。
869866:2007/03/09(金) 11:16:11
なるほど、いろいろあるんですね。sysreadもためしてみます。

>>868
ファイルはせいぜい10こ前後です。結局最初の方法でいいのかな・・

   `≡ 人
   ≡(_)
  `≡ (__)
  ≡( ・∀・)     ありがとですたー!
 ≡⊂⌒ ⊃⊃
 ≡ ̄◎ ̄◎  
870デフォルトの名無しさん:2007/03/09(金) 16:54:45
>>865 wcは質問者の環境であるWindowsでは駄目だろ。
871デフォルトの名無しさん:2007/03/10(土) 00:17:38
>>864
open(FILE, "filename");
while(<FILE>){};
print "$.\n";
close(FILE);
872866:2007/03/10(土) 07:38:15
>>870
そうですね^^;

>>871
なるほど、毎回カウントアップするよりこちらの方がいいかもしれませんね。
ありがトンございます(・∀・)
873デフォルトの名無しさん:2007/03/10(土) 07:47:10
perl -n 'if (eof) { print "$. $ARGV\n"; $. = 0; }'
874質問:2007/03/10(土) 13:11:58
netstat -sで出力される
Received Packets Delivered = 6558
Output Requests = 5420
を%dataにキーをReceived Packets Delivered、値を6558、
キーをOutput Requests、値を5420として格納したいのですが、下記のプログラムでは
どうしてもoutput requestsのほうだけが%dataに格納されてReceived〜のほうが
格納されません。どうしてでしょうか?
foreachを2回行えばいいとは思うのですが、もし読み込む行数が何万行になると
かなり負荷になるのでできればforeachを1回でうまく取り込める方法が知りたいのですが・・

#!C:\Perl\bin\

@naiyou=`netstat -s`;

foreach (@naiyou){
last if($_=~/Routing Discards/);
chomp;
if($_=~/(Received Packets Delivered)(\s+)=(\s)(\d+)/){
%data=("Received Packets Delivered"=>$4)
}
if($_=~/(Output Requests)(\s+)=(\s)(\d+)/){
%data=("Output Requests"=>$4)
}
}

@key=keys %data;
print"@key\n";
@val=values %data;
print"@val\n";
875デフォルトの名無しさん:2007/03/10(土) 13:15:42
>>874
%data上書きしてるやんか

$data{"key"} = val;
876874:2007/03/10(土) 13:23:56
キーがちがうから上書きにはならないと思っていましたが・・
877デフォルトの名無しさん:2007/03/10(土) 13:29:08
>>876
ハッシュの使い方が根本的に間違っている。

パンツを頭にかぶるくらい間違っている。
878デフォルトの名無しさん:2007/03/10(土) 13:35:44
>>876
基礎からやり直せ
879デフォルトの名無しさん:2007/03/10(土) 13:41:39
どうでもいいけど、 netstat -s が
何万行になる可能性ってあるの?
880874:2007/03/10(土) 14:08:39
いま$data{"key"} = val; にかえてみましたら、きちんと格納されていました。
配列なら本に書いていましたが、ハッシュも上書きになるとは思いませんでした。
ありがとうございました。
881デフォルトの名無しさん:2007/03/10(土) 18:38:34
マージを意図して書くならこう
%data = (%data, "foo" => "val");
882デフォルトの名無しさん:2007/03/10(土) 19:18:30
perlのオプティマイザはそれをなんとかできるほど賢くはなかった気がする。毎回ハッシュのつくり直しになりそう。
883881:2007/03/10(土) 19:57:05
言葉足らずだった。
実際こんなコーディングはしないけど、
874がどう間違えたのかの理解の助けになるかと思ってね。
884デフォルトの名無しさん:2007/03/11(日) 01:00:05
1回の実行で、その際使用された関数名を一覧することはできるでしょうか?
885デフォルトの名無しさん:2007/03/11(日) 01:39:32
日本語でおk
886デフォルトの名無しさん:2007/03/11(日) 02:32:07
っ Devel::Profile
887デフォルトの名無しさん:2007/03/11(日) 06:15:50
rubyのMailParserのようなモジュールってないですか?
MIME::Parserはちょっとちがうかなと思っています。
888デフォルトの名無しさん:2007/03/11(日) 12:31:03
>>887
まずはrubyのMailParserの仕様を説明しる
あるいはMIME::Parserの何が違うのか説明
889デフォルトの名無しさん:2007/03/11(日) 14:06:05
分からないのなら
無理に答えなくてもいいのに
890デフォルトの名無しさん:2007/03/11(日) 15:58:07
>>889
そこは素直に「実はRubyなんて知らずに質問しました、すみません」って
言っておけばいいところだと思うよ。
891デフォルトの名無しさん:2007/03/11(日) 16:18:20

私は質問者じゃありませんけど
「分からないなら無理に答えるな」
これ、どこかおかしいですか?
892デフォルトの名無しさん:2007/03/11(日) 16:21:59
あーあ、怒っちゃたよ
893デフォルトの名無しさん:2007/03/11(日) 16:22:47
いいんじゃない、答えなくてもいいって言ってるんだから、
>>889 みたいな失礼な奴はスルーで。
894デフォルトの名無しさん:2007/03/11(日) 16:27:45
はじめまして。何をやってもわからないので質問させてください。

print "<a href=\"$ENV{'SCRIPT_NAME'}?page=$id\" target=\"_blank\">スレタイ</a>"

みたいな感じでスレタイをクリックするとそのスレッドの内容の別ページが
開くようにしたいのですが、$ENV{'SCRIPT_NAME'}?page=1 になってるところを
クリックされた場合は$ENV{'QUERY_STRING'}にpage=1として返ってくると思うのですが、
それを分解して$form{'page'}=1 となるようにして、条件で

if($form{'page'}){ printPage() ; }

としてもひっかかってくれません。。なぜかわからないでしょうか・・
895デフォルトの名無しさん:2007/03/11(日) 16:31:03
反論出来ないのなら、私の勝ちですね。
簡単に論破出来ました。
頭の悪い人間の相手は簡単ですね。
896デフォルトの名無しさん:2007/03/11(日) 16:31:12
板違い
897デフォルトの名無しさん:2007/03/11(日) 16:35:01
>>894
板違い。WebProg板。
後、$ENV{"QUERY_STRING"}を
分解する部分のコードが怪しそうなのでそちらも添えて。
898デフォルトの名無しさん:2007/03/11(日) 16:53:16
>>896,897
失礼しました。。
WebProg板で質問してみます!
899デフォルトの名無しさん:2007/03/11(日) 20:24:44
Ruby のほうがモジュールもコミュニティも質が良いということですね。
VM 性能も、もうすく Ruby には YARV が搭載されちゃうからもう勝ってる
ところがなくなりますね。Perl6 がはやくできるといいですね。
900デフォルトの名無しさん:2007/03/11(日) 21:34:33
そうですね。
どうぞその優れているRubyとやらを使っていてください。
そしてこのスレにはもう来ないでください。
901デフォルトの名無しさん:2007/03/11(日) 21:46:17
そうそう、自分の劣等感を刺激するまともな人間は追い出すに限る。

>>899
今も昔もPerlスレは僕たち無能の馴れ合いスレです。まともな人は来ないでください!><
902デフォルトの名無しさん:2007/03/11(日) 23:30:12
あるパッケージが use もしくは require されているかを知る方法はありますか?
903デフォルトの名無しさん:2007/03/12(月) 00:29:48
>902
%INCを見たら幸せになれそう。
904デフォルトの名無しさん:2007/03/12(月) 00:31:41
CPANPLUSってどんなところが優れてるんですか。
905デフォルトの名無しさん:2007/03/12(月) 00:33:46
>>902
%INC

厳密に言うとわかるのはuseまたはrequireされたファイルだけどな。
906デフォルトの名無しさん:2007/03/12(月) 11:35:26
すみません、ワイルドカードが入った文字列を
評価するモジュール等はありますでしょうか?
諸事情で正規表現は使えません。
検索の仕方が悪いのか、ありませんでした。
宜しくお願いします。
907デフォルトの名無しさん:2007/03/12(月) 12:19:26
「ワイルドカードが入った文字列を評価する」じゃ何のことやらわからんよ。
もうすこしちゃんと説明したほうがいい。

お望みのものかどうかはわからんがとりあえず File::FnMatch をあげておこう。
908デフォルトの名無しさん:2007/03/12(月) 14:06:30
>>906
正規表現ではなくてワイルドカード? あのファイルのパターンマッチのやつ?
* を .* に変換して正規表現としてマッチさせればいいんじゃない?
あるいは、ファイル名検索したいだけなら glob() を使う。
909デフォルトの名無しさん:2007/03/12(月) 14:36:26
>>906
シェルのワイルドカードのことか? あれはGlobって言うんだぞ。

とりあえずText::Globってのがあるな。
910デフォルトの名無しさん:2007/03/12(月) 20:10:29
今、ソートの勉強しているのですが、

htmlのテキストボックス から数字を配列に入れてソートして1行1つの数値を出そうとしているのですが、
require cgi-lib.pl;

for($i = 1; $i <= 5; $i++)
{
$number[$i] = $in{"form$i"};
}

@number = sort {$a <=> $b} @number;

for($i = 1; $i <= 5; $i++)
{
$TEMP .= print "$number[$i]\n";
}

print $TEMP;

で、
1
2
3
4
5

とでてほしいのですが、

11111
に、なってしまいます。どこがおかしいか検討もつきません。
911デフォルトの名無しさん:2007/03/12(月) 20:17:14
$TEMP .= sprintf("%s\n", $number[$i]);
912910:2007/03/12(月) 20:34:40
>>911
ありがとうございます。
なぜか、$tempに蓄積されませんでしたが、
なんとか思い通りにできました。
913 ◆TWARamEjuA :2007/03/12(月) 21:04:06
(´-`).。oO(なんで11111になったのか理解したんだろうか。。。)
914デフォルトの名無しさん:2007/03/12(月) 22:11:19
つーか、そのprint文の出力はどこにいったのかと(r
915906:2007/03/13(火) 14:20:37
>>907
説明が分かりにくかったのなら申し訳ありませんが、
そのままです。ワイルドカードを含めた文字列を文字列Aとして、
文字列Bと比較しマッチするかどうかを求めるだけです。

>>908 >>909
正規表現は使わないと言ったはずです。
globは知っていますが、今回はファイル名を
抽出する事が目的ではありません。
Text::Globも内部的に正規表現を使っているのでお断りします。
916デフォルトの名無しさん:2007/03/13(火) 14:36:32
ツン・・・
917デフォルトの名無しさん:2007/03/13(火) 14:54:48
>>915
だったらまさしくfnmatchをしたいわけだから、File::FnMatchでいいんでない?
あれはCライブラリのfnmatchを呼ぶモジュールだから正規表現使ってないよ。
918906:2007/03/13(火) 14:59:43
すみません、書き忘れていました。
PurePerlなモジュールでお願いします。
919デフォルトの名無しさん:2007/03/13(火) 15:22:00
じゃあもう無理でいいよ
920デフォルトの名無しさん:2007/03/13(火) 15:22:53
正規表現使えばいいところを、わざわざ使わないで作られた公開モジュールなんてあるのかな?
自作するんならともかく。
921デフォルトの名無しさん:2007/03/13(火) 15:25:31
んなもんある訳なかろう。
釣りとしか思えん。
922デフォルトの名無しさん:2007/03/13(火) 16:14:29
>>918
出来合いのモジュールはまずないから、そこらからfnmatch.c拾ってきて
perlで書き直すぐらいしかないと思われる。
923デフォルトの名無しさん:2007/03/13(火) 17:51:27
正規表現を禁じられるとsplitするのも一苦労だな
sub stupid_split($$) {
my($sep, $src) = @_;
my $seplen = length $sep;
my @splited;

my $cur = 0;
while ((my $next = index($src, $sep, $cur)) != -1) {
push @splited, substr($src, $cur, $next - $cur);
}
continue { $cur = $next + $seplen }
push @splited, substr($src, $cur);
return @splited;
}
924デフォルトの名無しさん:2007/03/13(火) 18:38:02
釣りじゃないなら、なぜ正規表現を(モジュールの内部的にも)使っては
ならないのか、理由を言ったほうがいいね。多分、その理由を回避することの
ほうが楽だと思うが。
925デフォルトの名無しさん:2007/03/13(火) 18:46:47
何だこれw >>906
課題とか上司にそういうのを作れって言われたのか?
926デフォルトの名無しさん:2007/03/13(火) 18:58:36
perlから正規表現なくしたら何にも残らんわな
927デフォルトの名無しさん:2007/03/13(火) 19:00:08
どうせ宿題だろ。

>>918とか、ソース流用したいのミエミエ
928デフォルトの名無しさん:2007/03/13(火) 19:27:53
コアに用意されている機能をわざわざ使用しない意味がわからんな。
宿題を手っ取り早く片付けるのが目的なのであればスレ違いだ、去れ。
929デフォルトの名無しさん:2007/03/13(火) 20:10:40
しかし、「宿題」とすれば結構いいテーマだね。
そんなモジュール、絶対に無いはずだから、本人の掛け値なしの実力が試される。
930906:2007/03/13(火) 20:11:22
宿題じゃないよ。
理由は(?{〜〜})でコードを実行されたくない、
正規表現のコンパイルエラーで止まる、等。
回避術はいくらでもあるけど、
どれも美しくないので使いたくない。

というか、善良な質問者に対してその態度は何なの?
分からないのなら、無理に答えなくても良いんですよ?
931デフォルトの名無しさん:2007/03/13(火) 20:15:33
>善良

ここが笑うポイントですか
932デフォルトの名無しさん:2007/03/13(火) 20:17:30
以降>>906はスルーで
933デフォルトの名無しさん:2007/03/13(火) 20:18:09
>>931
放置するポイント
934906:2007/03/13(火) 20:22:45
いや、モジュールが存在しないのなら諦めますよ。
幸い時間だけはいくらでもあるので、
自分でガリガリとルーチンを書くのは可能なのですが…
なるべく車輪の再発明はしたくなかったので
このスレで質問させて貰った訳で、、、
935デフォルトの名無しさん:2007/03/13(火) 20:30:41
阿呆は放っておけよ
936デフォルトの名無しさん:2007/03/13(火) 20:38:36
任意のコードは実行できんがな
937デフォルトの名無しさん:2007/03/13(火) 20:39:29
馬鹿の言うことはレベルがちがうな
938デフォルトの名無しさん:2007/03/13(火) 20:55:48
任意のコードが実行できるような脆弱性やエラーで止まる事なんて、当然モジュールなら対策済みだろうに
それを使わずに「車輪の再発明はしたくない」とな?
939 ◆TWARamEjuA :2007/03/13(火) 20:56:40 BE:1634235-2BP(6811)
(´-`).。oO(トリップ付けて欲しいよなぁ)
940906:2007/03/13(火) 21:02:49 BE:716364599-2BP(3000)
トリップは付けないけど
クソコテなら名乗ったことがあるよ。
941デフォルトの名無しさん:2007/03/13(火) 21:12:49
>>930
正規表現でコードの実行なんて出来たっけ?
942デフォルトの名無しさん:2007/03/13(火) 21:27:22
943941:2007/03/13(火) 21:41:37
>>942
どもっス。
perlre読みなおしてきますた。
これってpatternのほうを変数にしてもランタイムエラーになって実行はされないっすよね?
944デフォルトの名無しさん:2007/03/13(火) 21:42:20
汚染された質問は実行しない方がよいようですな( ̄ー ̄)ニヤリッ
945デフォルトの名無しさん:2007/03/13(火) 22:15:43
みんなお触り好きだよねえ
946デフォルトの名無しさん:2007/03/13(火) 23:28:39
>>915
>Text::Globも内部的に正規表現を使っているのでお断りします。

>>930
>理由は(?{〜〜})でコードを実行されたくない、
>正規表現のコンパイルエラーで止まる、等。

なんかおかしいよな。
Text::Globがコードを実行させる正規表現なんか使うのか?
Text::Globがコンパイルエラーを起す正規表現なんか使うのか?
947デフォルトの名無しさん:2007/03/14(水) 00:20:27
どうみても釣り
948906:2007/03/14(水) 10:25:23
正規表現は使わないと、最初の条件に書いたはずですが。
正規表現使ったら1分で書けますよ、そんなもの。
949デフォルトの名無しさん:2007/03/14(水) 10:51:54
まだいたのか。

とりあえず、その1分で書ける正規表現の例を見せてよ。
それを見れば、具体的になにをしたいのか皆にわかるから。
950906:2007/03/14(水) 10:55:56
具体的に言うと、.htaccessってありますよね。
あれと同じで、ホスト名やらにワイルドカードを使い、評価したい訳です。
1分で書けるってのは、 * を .* に変えるやつです。
KENTがこの手法を使ってた覚えがあります。
951デフォルトの名無しさん:2007/03/14(水) 11:01:29
いや普通は*→.*にして他の記号はメタキャラクタとして解釈されないように
quotemeta相当のエスケープするように書くから正規表現使っても全く問題
ないわけですが... KENTとか引き合いに出すあたりどうみても釣りだし
しょうがないか。
952デフォルトの名無しさん:2007/03/14(水) 11:27:27
>>906
おめぇコテハン「正規表現は使わない」にしてこいよ。
そしたらちょっとは相手してやるよ。
953デフォルトの名無しさん:2007/03/14(水) 12:17:04
>>950
つーか、正規表現使わない理由がおかしいし。宿題厨はカエレ。
954デフォルトの名無しさん:2007/03/14(水) 12:33:18
正規表現を使わない理由=モジュールを使わない理由 になっていないわけだが。

> 理由は(?{〜〜})でコードを実行されたくない、
> 正規表現のコンパイルエラーで止まる、等。

これらは、モジュールを使えば解決する事。
希望通り、任意のコードが実行されるような脆弱性もなくて、エラーでもとまらなければ
実装に正規表現が使われていようがいまいが関係ないじゃん。
車輪の再発明を避けようとして、車輪を使うのをためらってどうする。
955デフォルトの名無しさん:2007/03/14(水) 12:44:07
> * を .* に変える

え?、変換後もワイルドカード文字が残ってるの?
956デフォルトの名無しさん:2007/03/14(水) 12:47:41
* -> .* じゃなくて
* -> [^/]* かな。
957デフォルトの名無しさん:2007/03/14(水) 12:55:48
カレーにヌルーしようぜ
958906:2007/03/14(水) 14:52:02
>>953
宿題?学校も行ってないのに、
誰が宿題出すんですか?逆に聞きたいよw

>>951 >>954
正規表現は使わないって
何回言えば理解出来るの?メクラですか?
959デフォルトの名無しさん:2007/03/14(水) 15:31:48
906 を NGName 指定で万事解決
960906:2007/03/14(水) 15:48:10
もう正規表現なんて使わないなんて、言わないよぜったいぃー
961906:2007/03/14(水) 16:00:23
俺が正規表現使うと日本が滅びるんだよ。
つまり俺は日本のために必死に頑張っているのであり
お前等の運命は俺に委ねられているんだよ。

わかったらとっとと俺を導け。
962デフォルトの名無しさん:2007/03/14(水) 16:03:28
>>961
正規表現が難しくて分からない って正直に言っちゃえよ。
963デフォルトの名無しさん:2007/03/14(水) 16:24:59
日本の運命は>>961に任せて俺は散歩行ってくる
964906:2007/03/14(水) 16:25:49
2ちゃんねるが無能の塊だということはよく分かりましたよ。
こんなところで訊いた私が莫迦でした。

二度と来ません。
965デフォルトの名無しさん:2007/03/14(水) 16:44:39
今日、2chで一番気分の良くなる書き込みを見たな(´ー`)y━~
966デフォルトの名無しさん:2007/03/14(水) 16:58:38
この後、散歩途中の>>962が、
コンビニで立ち読みしてる906を目撃しようとは
>>962本人も今はまだ気付いていなかったのである。
967デフォルトの名無しさん:2007/03/14(水) 17:01:21
流れを無視して書いてみたけど動かねえ
'*' の処理は再帰でいいよね?
968デフォルトの名無しさん:2007/03/14(水) 17:13:52
perl で質問です

TreePPというライブラリを使ってます。
連想配列 $tree というのがあってこれにXMLを展開したものを入れてあります。

<top>
<elem>1</elem>
<elem>2</elem>
</top>

こんな感じで
$value = $tree->{top}-{elem}[0];
とアクセスしますよね

elemの個数は不確定です。
1個の時に添え字を使うとperlがエラー起こします。

何個あるかどうかを調べるにはどうしたらいいのですか?
969デフォルトの名無しさん:2007/03/14(水) 17:22:50
想像だが常識的に考えると
scalar $tree->{top}->{elem};
あたりじゃないか?
970デフォルトの名無しさん:2007/03/14(水) 17:34:59
やってみたら HASH(0x1ad51b4) ってのが帰ってきます
971デフォルトの名無しさん:2007/03/14(水) 17:36:59
>>906
Perlで正規表現が使えないのは特殊なケースだと思いますので,
お探しのようなモジュールは絶対とは言い切れませんが,おそらくないと思います。

私は作れませんが,とても興味がありますので,
作られたら是非見せてください。
972デフォルトの名無しさん:2007/03/14(水) 17:37:30
Socket使ってWebページからソース取得したんだけどprintで出力すると
ヒ、ョ、・/b>
こんな感じに化けちゃっててシフトJISにまともにエンコできない
どうやって対処すればいいんだい?
973デフォルトの名無しさん:2007/03/14(水) 17:42:32
>>972
主にsjis以外で使われる文字コードはUTF8の場合が多い
jcode.pl pmはたぶんこのコード変換が出来ない

取得するページが固定ならperlソースのコードをUTF8に合わせてそのまま出力するのが一番簡単
どうしてもsjisに統一したければutf8用のライブラリがあるよ
974967:2007/03/14(水) 17:46:38
# 誰か添削plz
sub simple_fnmatch {
my ($pattern, $string) = @_;
my $p = 0;
my $s = 0;

while ($p < length($pattern)) {
my $char = substr($pattern, $p++, 1);
if ($char eq '?') {
} elsif ($char eq '*') {
$p++ while (substr($pattern, $p, 1) eq '*');
for my $pos ($s..length($string)) {
return 1 if fnmatch(substr($pattern, $p), substr($string, $pos));
}
return 0;
} else {
return 0 if $char ne substr($string, $s, 1);
}
$s++;
}
return $s == length($string) ? 1 : 0;
}
975デフォルトの名無しさん:2007/03/14(水) 17:47:15
>>968
使ったことないんだが
単数のとき、 $value = $tree->{top}->{elem};
複数のとき、 $value = $tree->{top}->{elem}->[0];
だよな?とすれば、
単数のとき、 ref($tree->{top}->{elem}) eq "HASH"
複数のとき、ref($tree->{top}->{elem}) eq "ARRAY" / $count = @{$tree->{top}->{elem}}
となるはず。
976デフォルトの名無しさん:2007/03/14(水) 17:56:39
>>975
一部できたけど
また問題がでました、elemが0の時はどうしたら?
977デフォルトの名無しさん:2007/03/14(水) 18:08:37
$havechild=0;
foreach $key(keys %{$tree->{top}}){
if($key eq "elem"){$havechild=1;last;}
}

これで出来たけどなんか長い
978906:2007/03/14(水) 18:40:19 BE:88440252-2BP(3000)
答えられなくなると、名前を偽って
マイナス要素になる書き込みをするんですね。
ここのレベルも落ちましたね。残念です。

>>962
そこまで頭は悪くありません。
普段は普通に使っていますので。
979デフォルトの名無しさん:2007/03/14(水) 18:55:28
典型的すぎてワロタ
980デフォルトの名無しさん:2007/03/14(水) 19:26:20
あと何回捨て台詞吐くのかな
981デフォルトの名無しさん:2007/03/14(水) 20:10:25
>>978
入力が何で出力が何したいのか書けば、
天才の俺が教えてやっても良い。
982デフォルトの名無しさん:2007/03/14(水) 20:17:14
>>974
マンドクセーからちゃんと読んでないが、fnmatch()の真似をしたいのなら
パスのセパレータ('/')は意識しないとだめだろう。
983906:2007/03/14(水) 20:20:25
>>981
自称天才の意味不明な要求なんか
聞く耳持てません。
俺はまともな人に向けて話しているんです。
984デフォルトの名無しさん:2007/03/14(水) 20:21:16
>>982
とりあえずめんどくさいので ? (任意の一文字) と * (任意の文字列) だけ実装してみました。
関数名が良くなかったですね。
985デフォルトの名無しさん:2007/03/14(水) 20:22:57
906が
> あれと同じで、ホスト名やらにワイルドカードを使い、評価したい訳です。
なんていうからこんな仕様になったんですけどね。
986デフォルトの名無しさん:2007/03/14(水) 20:23:18
http://rakuten.wise-policy.com/
おかげ様で完成です
よかったら使って下さい
987デフォルトの名無しさん:2007/03/14(水) 20:55:52
次スレはー?
988デフォルトの名無しさん:2007/03/14(水) 21:10:43
RFTM
989デフォルトの名無しさん:2007/03/14(水) 21:53:53
>>976
refが空文字を返してるんじゃないか?
そこまでは実装がどうなってるのか見てみないことには分からんが。
990デフォルトの名無しさん:2007/03/14(水) 22:56:51
991デフォルトの名無しさん:2007/03/15(木) 00:48:00
>>968
もう解決したかもしれんが、XML::TreePPならnewの時に
$obj = XML::TreePP->new( force_array => [ "elem" ] );
…とすれば、1個の時でも添え字を使える。
992デフォルトの名無しさん:2007/03/15(木) 21:22:51
梅?
993デフォルトの名無しさん:2007/03/16(金) 07:01:16
994デフォルトの名無しさん:2007/03/16(金) 08:37:42
995デフォルトの名無しさん:2007/03/16(金) 09:46:55






996デフォルトの名無しさん:2007/03/16(金) 10:44:07
>>995
どこを縦読みすれば?
997デフォルトの名無しさん:2007/03/16(金) 11:23:27
ume
998デフォルトの名無しさん:2007/03/16(金) 11:45:11
うめ
999デフォルトの名無しさん:2007/03/16(金) 11:46:23
1000!
1000デフォルトの名無しさん:2007/03/16(金) 11:47:11
               ┌┐                                ●●●
    人          ││                              ●\  ●\
   ノ二\  ナ ゝゝ   V                 ●●●        ●\     ●\
     /   / 乙 つ  O               ●\   ●\      ●\       ●\
                  ●●●        ●\     ●\    ●\       ●\
                 ●\   ●\      ●\      ●\    ●\        ●\
       ●●\     ●\     ●\    ●\       ●\   ●\        ●\
        ●\    ●\      ●\    ●\       ●\    ●\       ●\
        ●\    ●\      ●\    ●\      ●\    ●\     ●\
       ●\    ●\       ●\    ●\      ●\      ●\    ●\
       ●\    ●\      ●\    ●\     ●\        ●●● \
      ●\     ●\      ●\      ●\   ●\           \\\
      ●\     ●\     ●\        ●●● \
     ●\      ●\   ●\           \\\
     ●\        ●●● \                              ┌┐ ┌┐
    ●\          \\\      ┣━┳┃┃      ┃          ││ ││
   ●●●\                      ┃   ┃┃┃ ┣┓ ━╋ ━╋  V   V
   \\\\                     ┛     ━┛ ┃   ┏┫ ┏┫  O  O
                     (´´
 
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。