Perlについての質問箱 29箱目at TECH
Perlについての質問箱 29箱目 - 暇つぶし2ch1:デフォルトの名無しさん
06/12/21 22:35:39
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

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

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

URLリンク(www.perl.org)
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3

前スレ
Perlについての質問箱 28箱目
スレリンク(tech板)

リンク集は>>2-3
過去スレは>>4

2:デフォルトの名無しさん
06/12/21 22:36:10
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: URLリンク(www.site-cooler.com)

[本]
リャマ: URLリンク(www.oreilly.co.jp)
駱駝: URLリンク(www.oreilly.co.jp)
Effective Perl: URLリンク(www.ascii.co.jp)
クックブック: URLリンク(www.oreilly.co.jp)

[オンラインマニュアル] (追加)
最新のドキュメント: URLリンク(search.cpan.org)
perl5.8.xのドキュメント(一部): URLリンク(www.kt.rim.or.jp)
perl5.005_03 のドキュメント: URLリンク(www.kt.rim.or.jp)
日本語ドキュメント検索: URLリンク(www.cpan.jp)
perldoc.jp: URLリンク(www.perldoc.jp)
Perldoc.com: URLリンク(www.perldoc.com)

3:デフォルトの名無しさん
06/12/21 22:36:40
[モジュール]
CPAN.com: URLリンク(search.cpan.org)
河馬屋二千年堂: URLリンク(homepage3.nifty.com)

[テクニック]
Perlメモ: URLリンク(www.din.or.jp)
Perlのページ: URLリンク(homepage1.nifty.com)
Perlの小技: URLリンク(homepage3.nifty.com)

[Perl5.8Unicodeメモ]
URLリンク(www.pure.ne.jp)
URLリンク(www.namazu.org)
URLリンク(www.lr.pi.titech.ac.jp)

4:デフォルトの名無しさん
06/12/21 22:37:13
[過去スレ]
1 URLリンク(pc.2ch.net)
2 URLリンク(pc3.2ch.net)
3 URLリンク(pc2.2ch.net)
4 URLリンク(pc2.2ch.net)
5 URLリンク(pc5.2ch.net)
6 URLリンク(pc5.2ch.net)
7 スレリンク(tech板)
8 スレリンク(tech板)
9 スレリンク(tech板)
10 スレリンク(tech板)
11 スレリンク(tech板)
12 スレリンク(tech板)
13 スレリンク(tech板)
14 スレリンク(tech板)
15 スレリンク(tech板)
16 スレリンク(tech板)
17 スレリンク(tech板)
18 スレリンク(tech板)
19 スレリンク(tech板)
20 スレリンク(tech板)
21 スレリンク(tech板)
22 スレリンク(tech板)
23 スレリンク(tech板)
24 スレリンク(tech板)
25 スレリンク(tech板)
26 スレリンク(tech板)
27 スレリンク(tech板)
28 スレリンク(tech板)

5:デフォルトの名無しさん
06/12/21 22:38:30
>>1 乙でし

6: ◆TWARamEjuA
06/12/21 22:56:34 BE:4574276-BRZ(6677)
(´-`).。oO(「埋め」やっているやつは石器時代の人間か?)

7:デフォルトの名無しさん
06/12/21 23:05:10
>>6
現代人なら何するの?

8:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/21 23:29:13
>>7
1000まで無駄なく使う、ってわざわざ言わなきゃわからないのか?

10:デフォルトの名無しさん
06/12/21 23:38:48
スレ隔てると中途半端になりそうな気もするがね。


11:デフォルトの名無しさん
06/12/21 23:42:00
C/C++も、Javaも、Rubyも、Pythonも宿題スレがあるんだな。
だから空気の読めない初心者が混ざるのか。

12:デフォルトの名無しさん
06/12/22 00:03:24
ちゃんと問題そのものを載せてくれるとまだ良いんだけどな

13:デフォルトの名無しさん
06/12/22 01:30:06
>>11
質問箱なんだから初心者が来るのは構わないんだけど結局>>12の言うとおりじゃない?

14:デフォルトの名無しさん
06/12/22 01:58:54
問題そのものを載せないのもそうだが
コードが動かないときに自分の思いこみでコードの一部分だけ切り出して貼ったり
途中までやったけど分かりませんって書いて コードは一行もなかったり

15:GOLFer名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/22 12:42:52
>>14
なんかエラーがでます。







そのエラーを貼れよ!!

18:デフォルトの名無しさん
06/12/22 22:16:57
○○ if △△ の形の条件分岐とかって使ってる? 俺は使ってないんだが。

19:デフォルトの名無しさん
06/12/22 22:20:55
next ifとreturn ifは使う

20:デフォルトの名無しさん
06/12/23 00:05:34
elseを伴わない場合で処理が1行ならほぼ間違いなく使う。

21:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/23 00:19:52
そもそも、バイト列の並びから文字コードを確実に判定する方法なんてないですよ。

23:デフォルトの名無しさん
06/12/23 01:01:47
だよね
可能なら自動判定は避けるべき
漢字一文字だと一部の漢字は自動判定できないし
cgiの場合なら入力時の漢字コードは決まっていると思うので、元の漢字コードを指定しましょう

24:18
06/12/23 01:44:44
結構みんなバラバラなのね。うちの周りだと使ってる人がほぼゼロだった。
純粋なPGがいないからかもしれないが。

25:デフォルトの名無しさん
06/12/23 01:51:22
関係ないですが

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

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

・・・・余談でつ。

26:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/23 03:25:00
>>26
後者は同意だけど、前者は
my $fh = new IO::File ">hoge"
    or return;
と書くおいら

perlstyleに言及があるとおり、場面に合わせて読みやすいであろう方を選択だよね。

28:デフォルトの名無しさん
06/12/23 08:33:59
ソースのインデント増やしたくないから積極的に
利用する(ある意味 next とかの積極利用なんだけど )

29:デフォルトの名無しさん
06/12/23 08:54:26
PBPに
while ( <> ){
 next if !/^(\S+)\s+(\S+)$/ ;
 #ここで$1, $2 の処理をする
}
みたく書いてあったときはある意味衝撃だったw
ええ知らなかっただけですともorz...

30:デフォルトの名無しさん
06/12/23 10:12:42
\ を一々 \ に変えてる奴って頭おかしいの?

31:デフォルトの名無しさん
06/12/23 10:21:08
>>30
Safari厨だと思われ。

32:デフォルトの名無しさん
06/12/23 12:21:42
Vistaになればみんなそうなるのかな?

33:デフォルトの名無しさん
06/12/23 13:43:42
>>32
ならない。

34:デフォルトの名無しさん
06/12/23 16:33:52
useしたモジュールで発生する"Use of uninitialized value"エラーを出力させたくないのですが、
どのようにしたらよろしいでしょうか?
モジュールには手を加えたくないのですが。。

35:デフォルトの名無しさん
06/12/23 16:59:53
perl -w を使わずに use warnings すればいいんじゃね?

36:34
06/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:デフォルトの名無しさん
06/12/23 17:52:44
>>36
つまり何か。hogehogeモジュールがその中でwarningsプラグマを有効にしているにも拘らず、
正常な処理の範囲内でundefinedな値のチェックを怠っていて、しかも、
他の人が作ったモジュールだから触るわけには行かない。とそういう状況なわけか。

38:34
06/12/23 18:01:53
>>37
Yes!まさにその通りです!

39:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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.

42:34
06/12/23 23:26:18
>>39-41
ありがとうございます _ _
>>39さんの1の方法を使わせていただきました。
>>40
no useは地の文での解釈となってしまうようでした。

43:デフォルトの名無しさん
06/12/24 12:18:30
perl で PDFからテキストコンバータしたいんだけど、そんなモジュールってある?

44:デフォルトの名無しさん
06/12/24 12:34:08
URLリンク(search.cpan.org)
たくさんあるんじゃね?

45:デフォルトの名無しさん
06/12/24 12:36:07
CPANでそうやってけんさくするのか。
 ありがとう。

46:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/24 17:36:55
「4の倍数」や「4で割り切れる」という条件は、どのように表したらよいのでしょうか?


48:デフォルトの名無しさん
06/12/24 17:51:58
>>47
if ($num % 4 == 0)

49:デフォルトの名無しさん
06/12/24 18:18:20
>>46
ppm install

50:46
06/12/24 19:14:23
すいません自己解決しました。
vcのincludeやlibへのパスがうまく通っていなかったようです。
設定しなおしたらmakeできました。

>>49
ppmでやろうと思ったらそんなもんねーよとppmに怒られてしまいました。

51:47
06/12/24 20:06:57
2で割り切れても50で割り切れない
上記のようなものはどう表示すればよいのでしょうか?

52:デフォルトの名無しさん
06/12/24 20:14:04
これはひどい

53:47
06/12/24 20:25:26
事故解決しました

54:デフォルトの名無しさん
06/12/24 20:27:39
>>51
if(2で割り切れる? = はい){
 if(50で割り切れる? = いいえ){
  print "2で割り切れるけど、50で割り切れないよ。";
 }
}

55:デフォルトの名無しさん
06/12/24 20:35:28
>>50
解決して何より。
だけどppmはリポジトリを追加するともっと強力になるよん。
Encodeの最新版はTheoryx5リポジトリにある。
Encode-EUCJPMSは検索したらパッケージを作ってる人がいました。
URLリンク(asakura.g.hatena.ne.jp)

56:デフォルトの名無しさん
06/12/24 21:02:59
>>50
ppm では
search hoge* してからにすべし

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

<ちらしの裏>
追記すると、最新の ActivePerl (Win32) では
ppm だと GUIウインドウが開く。
ppm-shell だと、従来通りのコマンドライン版が起動する。
</ちらしの裏>


57:デフォルトの名無しさん
06/12/24 23:13:43
perlって何を造るための言語なんだ?
結局はWeb関連だったらツマランわ

58:デフォルトの名無しさん
06/12/24 23:17:02
聖夜釣ですか

59:デフォルトの名無しさん
06/12/24 23:35:41
Spreadsheet::WriteExcelでは既存のファイルを開けないことが判明orz
VBAコードを仕込んでおきたかったんだけど、なんかうまい方法はないでしょうか。
Linuxサーバ上でやりたいため、WIn32::OLEという解は使えません…。

60:デフォルトの名無しさん
06/12/25 13:28:50
>>57
Perl is a programming language for getting your job done.

61:デフォルトの名無しさん
06/12/25 18:56:23
すみません。どなたか教えてくださいませ。
コード値を文字にしたいのですが、日本語はどのようにしたらよろしいのでしょうか?
chrは2バイト文字はだめってのはわかったんですが。
ちなみにシフトJISのコードを変換したいです。
例 0x82A0 → あ

62:デフォルトの名無しさん
06/12/25 19:17:21
$str = pack("H*","82A0");

63:61
06/12/25 19:22:37
>62
ありがとうございます!
packの奥は深いっすね~
もっと勉強します!


64:デフォルトの名無しさん
06/12/25 21:15:28
>>60
ワロタ


65:デフォルトの名無しさん
06/12/26 01:22:43
今日からオライリーのPerlの本で勉強始めます。
来月から仕事で使いそうなんで・・・

66:デフォルトの名無しさん
06/12/26 01:33:16
ここは俺の日記帳だからお前は日記を書くな

67:デフォルトの名無しさん
06/12/26 01:39:30
chomp

68:デフォルトの名無しさん
06/12/26 03:21:37
質問

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

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

実行結果
--------------------
あー
あ[
--------------------

69:68
06/12/26 03:24:04
追記
環境Windowsで.plファイルのエンコードはShift-JISです。
実行結果はコマンドプロンプトでの実行結果です。

70:デフォルトの名無しさん
06/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よりあ[となります。

71:68
06/12/26 04:50:18
>>70
丁寧な解説ありがとうございました。

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

$str =~ s/\x81\x7c//g;
とすることによって解決できました。

72:デフォルトの名無しさん
06/12/26 10:26:52
そうくるかw

73:デフォルトの名無しさん
06/12/26 11:46:16
Perl4時代の息吹を感じました。

74:デフォルトの名無しさん
06/12/26 16:00:24
すみません、CPANにあるHTML::TableExtractについての質問です。
URLリンク(search.cpan.org)
↑のREGULAR METHODSにあるdepths()メソッドの文字を変数に代入したいんです。。
然るべき手順を踏んで、
print $te->depths();
するときちんとdepths()メソッドの文字が表示されるのですが、
my $test = $te->depths();
print $test;
すると"Use of uninitialized value in print"というエラーが出てしまいます。。
全く訳が分からず打ち間違えを確認したりして同じ事を何回も繰り返したりしたのですが、
訳が分からないです。。どなたがご助言お願いいたします _ _

75:デフォルトの名無しさん
06/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 ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /

76:74
06/12/26 16:04:22
ごめんなさい。配列型で返ってきてました。。

77:デフォルトの名無しさん
06/12/26 16:26:50
>>73
use utf8を使えば文字を直接置換できるかな?

78:デフォルトの名無しさん
06/12/26 16:43:49
>>68
スレリンク(php板:498-512番)

79:デフォルトの名無しさん
06/12/27 02:04:44
パール無図杉

80:デフォルトの名無しさん
06/12/27 23:00:18
すみません、質問があります。
WindowsのActive Perl v5.5.8です。
UTF16の日本語ファイルを開いて処理させようとすると
処理結果のテキストが文字化けしてしまいます。
Shift JISとUTF8形式だと問題なく処理できるのですが…。
UTF16でうまく処理できる方法はないでしょうか?

81:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/28 01:12:53
>>80
前スレがまだ残っているので、前スレ 694 からの流れを参照。
対策としては、前スレ 703 のリンク先にある方法が無難だと思う。

83:デフォルトの名無しさん
06/12/28 01:24:39
>>81さん
シフトJISのときは何も指定せずにいけました。
>>82さん
ありがとうございます。
明日頑張ってみます。

84:デフォルトの名無しさん
06/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
06/12/28 13:23:20 BE:2178454-BRZ(6677)
Net::DNS を利用するのはいかがかしら?

86:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/28 17:43:14
普通に前後で現在時間を求めて引き算すればいいのでは?

88:デフォルトの名無しさん
06/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ザウルス
06/12/28 18:54:03
任意の文字列からhttpで始まる単語(区切りはスペース)を切り取るにはどうしたらいいでしょうか
$str = aaaa bbbb ccc URLリンク(ddd.vv.vv)<)
という文字列から「URLリンク(ddd.vv.vv)<)」を切り出す方法です

90:デフォルトの名無しさん
06/12/28 18:59:42
@a = grep /^http/, split / /, $str;

91:デフォルトの名無しさん
06/12/28 19:05:18
@a = $str =~ /(?:^| )(http.*?)(?: |$)/g;

92:デフォルトの名無しさん
06/12/28 19:53:46
>>55
>>56
遅くなりましたが、ありがとうございました。
レポジトリを追加したらだいぶ便利になりました。
パッケージをダウンロードしてきてそのまま追加することもできるようになりました。

93:名無しさん@Linuxザウルス
06/12/28 20:04:48
>>90,91
サンクス

94:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/28 20:48:34
>>94
先読み否定。色々仲間があるので詳細はperlre参照。
s/s(?!tring)/z/g;

96:デフォルトの名無しさん
06/12/28 21:14:01
任意の精度の数値演算したいんですけど、
どうすればいいでしょうか?


97:デフォルトの名無しさん
06/12/28 21:16:21
あ、Math::BigFloat モジュールってのがありました
すいません m(__)m

98:デフォルトの名無しさん
06/12/28 21:17:16
>>95
ありがとうございました。

99:デフォルトの名無しさん
06/12/29 05:18:57
FTPプロトコルでリモートにファイル転送するスクリプトを作ってるのですが
ローカルとリモートで同名だけどリモートの方がファイルサイズ小さい場合
差分のみ転送にしたいのですがレジュームはどうやればできますでしょうか?
perldoc Net::FTP
でresumeをキーに検索したのですが見当たりませんでした。
よろしくお願いします。

100:99
06/12/29 08:20:07
自己レス

FTP resume perlをキーにググッたら下記の情報見つけた
URLリンク(www.garayed.com)

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

しかしputメソッドは第3引数でオフセット値を指定できないんだ???

101:デフォルトの名無しさん
06/12/29 08:59:14
どこまできちんと届いているかは、クライアントしか知らないから、
レジュームって普通クライアントから要求するようになってると思うよ。

102:デフォルトの名無しさん
06/12/29 09:29:59
>>100
Net::FTPだったらputじゃなくてappendにしないと上書きされちゃうよ

>>101
99は具体的なやり方聞いてるのにそんな回答しても意味ネェだろw

103:デフォルトの名無しさん
06/12/29 12:03:50
Perllこついての質問箱?

104:デフォルトの名無しさん
06/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です

105:SONY
06/12/29 15:18:48
>>104
仕様です

106:デフォルトの名無しさん
06/12/29 16:12:31
GK涙目wwwwwwwwwwwww

107:デフォルトの名無しさん
06/12/29 17:03:26
-----------------
これURLリンク(www.example.com) とURLリンク(www2.example.com) これ
-----------------

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

-----------------
これ<a href="URLリンク(www.example.com) と<a href="URLリンク(www2.example.com) これ
-----------------

仕様としましては

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

です。
100stepくらい使えば書けないことはないと思うのですが、
スマートな方法は全く思いつきませんorz

108:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/29 17:24:21
use encodingは弊害がでかすぎるかと…。


110:デフォルトの名無しさん
06/12/29 17:26:35
>>107
要するにhttp urlの正規表現が解ればいいわけね。
URLリンク(www.din.or.jp)

111:デフォルトの名無しさん
06/12/29 17:31:39
>>110
>要するにhttp urlの正規表現が解ればいいわけね。
違うッスorz

(1)(2)だけなら $line =~ /(h?)(ttps?:\/\/[^ |^ ]+)/ で。。。

112:デフォルトの名無しさん
06/12/29 17:34:07
>107

use strict;
use warnings;

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

__DATA__
これURLリンク(www.example.com) とURLリンク(www2.example.com) これ

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

>108
use encodingはきちんと理解して使わないとバグの元にしかならないから反対。

113:デフォルトの名無しさん
06/12/29 17:35:35
s{(h?(ttps?://[^\s ]+))}{<a href="h$2">$1</a>}g;
ごめん、間違えた。

114:デフォルトの名無しさん
06/12/29 17:37:13
全角空白って文字クラスにそのまま放り込んで大丈夫なんかいな

115:108
06/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);


116:109
06/12/29 18:24:42
>>108=115

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

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

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

次ぎスレに115のテンプレを追加して様子を見るのがいいのかな。


117:デフォルトの名無しさん
06/12/29 18:40:57
両方うぜーよwebprogでやれ

118:109
06/12/29 21:07:36
>>117 うぜぇのは同意だけど、ウェブはかんけぇねだろバーカw

119:デフォルトの名無しさん
06/12/29 21:10:13
レベル的に物凄く関係ありまふ

120:デフォルトの名無しさん
06/12/29 21:15:52
くだすれPerlだな

121:デフォルトの名無しさん
06/12/29 21:24:28
117のスルー力たんないからスレが荒れたな。
スルー力身につくまでおまえがROMるかwebprog行ってろ

122:デフォルトの名無しさん
06/12/29 22:30:03
>>104
Jcode.pmにパッチあててなくね?


123:デフォルトの名無しさん
06/12/29 22:46:19
するーかって何だよ
スルメイカかよ

124:デフォルトの名無しさん
06/12/29 23:08:30
>>123
どうも「スルーする力(ちから)」という意味みたいだな。
それより、>>117にぴったりのスレがあるぞ。こっちで活躍したらどうだ

【Perl上級者コーナーPart01】
スレリンク(php板)l50


125:デフォルトの名無しさん
06/12/29 23:24:05
ゾーキャスラー力を思い出す流れだが、まぁ通じないだろう。

126:107
06/12/30 00:21:53
>>112,113

できました!ありがとうございましたm(_ _)m

127:デフォルトの名無しさん
06/12/30 09:48:58
URLリンク(www.google.co.jp)
スルーカ の検索結果 約 173,000 件中 1 - 10 件目 (0.03 秒)


128:デフォルトの名無しさん
06/12/30 09:53:09
Срука


129:デフォルトの名無しさん
07/01/01 03:05:23
kent-web の sunbbs.cgi を改造しまくって使っています。
記事番号が奇数番号のときと偶数番号のときとで、
交互に違う情報を入れたいと思っているのですが、
perl で偶数と奇数を判別するのってどうやればいいんでしょうか?

130:デフォルトの名無しさん
07/01/01 03:07:15
%2

131:デフォルトの名無しさん
07/01/01 03:14:40


132:デフォルトの名無しさん
07/01/01 03:22:34
>>129
2で割った余りが0なら偶数、1なら奇数と判定すればOK

133:デフォルトの名無しさん
07/01/01 07:26:19
1 と and とって1ビット目が 0 か 1 かで判断してもおk

134:デフォルトの名無しさん
07/01/01 15:02:29
>>132-133
例文でお願いしますです。orz

135:デフォルトの名無しさん
07/01/01 15:12:55
>>134
この程度のこともわからないのに
>kent-web の sunbbs.cgi を改造しまくって使っています。
なのか

136:デフォルトの名無しさん
07/01/01 15:22:34
>>134

%2

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

$a = 234;

if ( $a & 1) { print "奇数" }
else { print "偶数" }

138:デフォルトの名無しさん
07/01/02 00:43:33
詳解 正規表現
をかったんだよお年玉で

139:デフォルトの名無しさん
07/01/03 10:43:45
WINDOWSの鯖でファイルが書き込み可能かどうかを判断するにはどうしたらいいんですか?
WINDOWS鯖の場合だと
if (-w $write_file_path) { print "書き込み可能\n"; }というプログラムがが使えないんです


140:デフォルトの名無しさん
07/01/03 11:06:17
>>139 == スレリンク(php板:635番)

マルチなので放置しましょう

141:デフォルトの名無しさん
07/01/03 11:20:32
>>109
>use encodingは弊害がでかすぎるかと…。

kwsk.

 今まで、Jcode->new($hogehoge)->sjis; でちまちま変換していた者としては
 use encoding という技は新味ですyo.

142:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/03 14:35:27
>>142
そういうのは400,100,4の順番に判定するんだよ

144:デフォルトの名無しさん
07/01/03 14:45:24
なんてほのぼのする質問だろう

145:デフォルトの名無しさん
07/01/03 14:52:27
正直に課題って言ったのも好感w

146:デフォルトの名無しさん
07/01/03 15:09:31
>>142
最初の条件 $y %4==0 が、「4で割り切れたら」だから、4で割り切れる数字は、
全てここで引っかかっちゃうよ。

147:デフォルトの名無しさん
07/01/03 17:45:10
(´・ω・)ヤサシス

148:デフォルトの名無しさん
07/01/03 20:54:19
なんでうるう年は4年に一回なのに400と100も判定にいれるの?

149:デフォルトの名無しさん
07/01/03 20:55:00
>>148
それは冗談で言っているんだよな。

150:デフォルトの名無しさん
07/01/03 21:13:58
愉快なスレだな

151:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/03 21:25:31
アッー!

153:デフォルトの名無しさん
07/01/03 21:27:16
>>151
反則です

154:デフォルトの名無しさん
07/01/03 21:31:37
しかし >>142 にはモジュールを使ってはいけないなんて一言も(ry


まあ冗談だろうけど、実際に閏年の判定を書くとしたら >>151 なんだよなぁ・・・。

155:デフォルトの名無しさん
07/01/03 21:41:17
>>149
まあ、今後 90年以上は >>148 が正しいわけだが。

156:デフォルトの名無しさん
07/01/03 21:41:24
でもデフォルトで入ってたっけ?

157:デフォルトの名無しさん
07/01/03 21:50:31
最新のactiveperlには入ってた。

158:デフォルトの名無しさん
07/01/03 22:00:08
>>142の心温まる条件式を眺めてると、質問者に>>151を見て欲しくない気持ちになってきた。

159:デフォルトの名無しさん
07/01/03 22:20:40
4000年で割り切れる年も入れないとね。

160:デフォルトの名無しさん
07/01/03 22:34:26
>>159
どんだけ先の話やねん

161:デフォルトの名無しさん
07/01/03 22:51:30
つ 「このように広く普及するのであれば、もっとちゃんとした設計を施すべきだった」

162:デフォルトの名無しさん
07/01/03 22:59:36
そんなに長いこと使われないだろうと思って作ったソフトが2000年問題とかの原因になったんだよな
1993年使われ続けることも考慮しとくべきだな

163:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/03 23:04:31
だが、心配のしすぎではないか。

165:デフォルトの名無しさん
07/01/03 23:08:42
もうまもなく4000年になろうとしているのに4000で割り切れる年を閏年にすべきか否かは未だ意見の分かれるところだね。
地球の自転が遅くなるからとか言うが。小賢しい。

166:デフォルトの名無しさん
07/01/03 23:10:06
そういってy2kが問題になってたんじゃないか。
だいたい時間を1970/01/01 00:00からの32bit整数であらわすのも心配だな。やっぱり64bitはほしいところだ。

167:デフォルトの名無しさん
07/01/03 23:20:41
符号付 64ビット整数で紀元からのピコ秒数で数えることにすると紀元の前後300年弱しか表せない。

168:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/04 00:32:15
じゃあ紀元から符号付で128bitあれば足りるかな。

170: ◆TWARamEjuA
07/01/04 00:35:18 BE:5336677-BRZ(6700)
コンパイル時に指定してあげれば、、、@64bits

171:デフォルトの名無しさん
07/01/04 09:43:47
ピコ秒って光が30cmしか飛べないんだぜ。
原子時計の精度が1ピコ秒なんだぜ。
どうやって計るんだぜ?

172:デフォルトの名無しさん
07/01/04 13:46:03
>>168
表示はされたけど1901年だったわさ

173:デフォルトの名無しさん
07/01/04 19:54:07
>>171
10E-16sオーダの時間の計測に成功したっていうニュースなら見た気がするが。

174:デフォルトの名無しさん
07/01/04 20:23:27
不確定性原理からいくと、最小の時間単位は何だっけ?

175:デフォルトの名無しさん
07/01/04 20:34:09
プランク時間か?

176:デフォルトの名無しさん
07/01/04 23:41:55
当方perl初心者です。
全角スペースを半角スペースに置き換えたく、
~s/\xA1\xA1/\x20/g
としています。スペースの置き換え動作自体はするんですが、「ァー」や「ぁ!」などの文字列が文字化けするようになりました。
文字コードはEUCです。

コードを調べてみると「ぁ!」は
A4 A1 A1 AA となっており、全角スペースと誤認してしまうようでした。
どのように解決したら良いのでしょうか、教えてください。

177:デフォルトの名無しさん
07/01/04 23:49:59
require 5.8.1;
use encoding 'euc-jp';

178:デフォルトの名無しさん
07/01/04 23:50:19
URLリンク(www.din.or.jp)

179:176
07/01/05 00:12:36
解決しました。ありがとうございます。

180:デフォルトの名無しさん
07/01/05 13:30:32
さんざんキシュツかもしれませんが、見つからなかったので質問。

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

---

my $IE = "c:\\Program Files\\Internet Explorer\\IEXPLORE.EXE";
system ($IE, "URLリンク(www.hotmail.com"));

---

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

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

---

別プロセスで動かしたい、どうれすればよいのでしょうか?

181:デフォルトの名無しさん
07/01/05 13:41:21
system(1, ...);

ActivePerl限定だった希ガス

182:デフォルトの名無しさん
07/01/05 13:45:21
日本語が得意なフランス人みたいな日本語だな。

183:180
07/01/05 14:54:17
すげー。うまくいった。ありがとう。m(_ _)m

>>182
確かに今読み直すと変だね。

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

1行に出来るんだから行数関係ないっていわれそうですが6行くらいで、掲示板として機能していたPerlのプログラムでした。
2chのどこで見たんだったかなぁ、、

185:デフォルトの名無しさん
07/01/05 21:26:55
七行プログラミング part5
スレリンク(tech板)

186:デフォルトの名無しさん
07/01/05 21:32:38
七行プログラミング
スレリンク(php板)

187:デフォルトの名無しさん
07/01/05 22:38:22
>>185-186
それっぽいです。
ありがとうございました。

188:デフォルトの名無しさん
07/01/06 02:56:25
ダイス用のモジュールってありませんか?
$s に 3d20+10 のような文字が入ってたら、20面ダイスを3回振って結果に10を足す、ような。

$s に複数入っててもちゃんと計算してくれるのが良いです。更に言うと 1d6+5-4 のように加算減算も複数扱えると尚良いです。
自作しようかと思ったら結構フクザツで・・・。


189:デフォルトの名無しさん
07/01/06 03:32:00
URLリンク(search.cpan.org)
こんなんあったよ。
あとはsplitしたり調整したりするラッピングするだけで実装できるんじゃない?

そんなマニアックなものあるかよ!と思ったらあったw
恐るべしCPAN

190:デフォルトの名無しさん
07/01/06 03:37:50
置換 + evalで出来るよと言おうとしたけどCPANに真面目なのがあったか。
CPANスゲー

191:188
07/01/06 04:23:08
おおー、CPANにあるんですね!
最近 Perl と離れてたんですが、やっぱり便利だ!

ありがとうございました。

192:デフォルトの名無しさん
07/01/06 21:10:42
正規表現で()を後方参照としてではなく、ただの括弧としてマッチさせたい場合どう書けばいいんでしょうか

193:デフォルトの名無しさん
07/01/06 21:13:44
(?:re)

194:デフォルトの名無しさん
07/01/06 21:14:04
(?:pattern)

つperlre

195:デフォルトの名無しさん
07/01/06 21:34:41
おおぅ、それグループ化のみだと思ってました
ありがとうございます

196:デフォルトの名無しさん
07/01/06 21:39:55
\( ではないのか

197:デフォルトの名無しさん
07/01/06 21:48:35
括弧としてマッチさせるには \( が正しいみたいです
お騒がせしてすみません
>>196 ありがとうございます

198:デフォルトの名無しさん
07/01/06 22:19:53
すいません、ちょっと質問ですが、
Perl モジュールをCPANに登録して公開するときって、
GPLライセンスでいいんですか?
URLリンク(ja.wikipedia.org)
それとも、この Artistic License ですか?


199:デフォルトの名無しさん
07/01/06 22:26:32
Module::License::Reportなんてのがあるくらいだし
Apache Licenseとかも混じってるし
URLリンク(www.google.co.jp)

なんでもいいんじゃない?

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

<blockquote cite="URLリンク(www.gnu.org)
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:デフォルトの名無しさん
07/01/07 02:04:43
修正BSDとかMITとかもあるけど。やっぱりGPL/Artisticのデュアルライセンスにしとくのがいいかな。

202:デフォルトの名無しさん
07/01/07 05:25:31
[1-9.]のみで構成される文字列を表示したいのですが

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

だとうまくいきません。
どのように修正すればいいですか?

203:デフォルトの名無しさん
07/01/07 05:25:42
(?: って変数に入れないようにするやつでしょ?

204:デフォルトの名無しさん
07/01/07 05:28:07
print "$&\n" if $text =~/[1-9.]/;

205:デフォルトの名無しさん
07/01/07 05:32:00
文字列だった。すまん
一つだけなら
/[1-9.]+/
すべてなら
print(join(',', /[1-9.]+/g));

206:デフォルトの名無しさん
07/01/07 06:01:09
#!c:\usr/bin/perl ←だとアクセスできますが、
#!usr/bin/perl ←だとアクセ500のエラーがでます。
3時間探しましたが答えが見つかりませんでした。
よろしくお願いします。

os:win2000
webserver:apache 2.059
active perl




207:デフォルトの名無しさん
07/01/07 06:04:39
>>206
#!/usr/bin/perl

208:デフォルトの名無しさん
07/01/07 06:05:19
スラッシュ一個たんなくね?

×#!usr/bin/perl
○#!/usr/bin/perl


209:デフォルトの名無しさん
07/01/07 06:09:07
>>207-208
いろいろやっていくうちに"/"が消えてました。
やっとゴールにたどり着きました。ありがとうございました。

210:デフォルトの名無しさん
07/01/07 06:25:02
>>205
説明不足ですみません。

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

というような不要な文字が1つでもあれば
無視するといった感じのものが作りたかったのです。
よろしくお願いします。

211:デフォルトの名無しさん
07/01/07 06:30:58
$text =~/^[1-9.]+$/ and print "$&\n";

212:デフォルトの名無しさん
07/01/07 06:32:14
printのとこ、$textじゃなくてわざわざ$&で出力する意味あるの?

213:デフォルトの名無しさん
07/01/07 06:35:49
短縮。

214:デフォルトの名無しさん
07/01/07 06:40:16
>>211
無事作成できました。ありがとうございました。

215:デフォルトの名無しさん
07/01/07 07:26:19
2chのdatファイルを、差分で取得したいのですが、どのようにしたらよいのでしょうか?

216:デフォルトの名無しさん
07/01/07 08:09:31
If-Modified-Since と Range をつけて叩いて 206|304|416 のどれかをもらうようにする

217:デフォルトの名無しさん
07/01/07 14:11:53
package の中で、

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

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

どう書くのが正解でしょうか?

218:デフォルトの名無しさん
07/01/07 15:06:23
>>202
\. じゃなくてええの?

219:デフォルトの名無しさん
07/01/07 15:44:04
>>218
自分でちょっと試せばいいだろ

print "Match€n" if 'ABC' =~ /[.]/;

220:デフォルトの名無しさん
07/01/07 17:38:56
>>218
文字クラスの中だから

221:デフォルトの名無しさん
07/01/07 20:45:01
>>217
prototypeに頼らないのが正解。
そのprototype、第一引数について書かれてないけど。

222:デフォルトの名無しさん
07/01/07 22:45:16
ppmをつかってモジュールを持ってくるときに、zipで圧縮されてると展開方法を知らんとエラーが出てしまうのですが、
どうすればこのエラーが出なくなるんでしょう。

223:デフォルトの名無しさん
07/01/07 23:28:08
Archive::Zip入ってる?

224:デフォルトの名無しさん
07/01/08 00:48:56
>>223
入ってます。

225:デフォルトの名無しさん
07/01/08 01:27:07
手元だとzipアーカイブでもインストールできるなぁ。どこのリポジトリの何で発現してる?

226:デフォルトの名無しさん
07/01/08 01:49:50
>>225
ためしに再インストールしようとしたArchive::Zipで出てます。。。
何処のレポジトリかはどうやってわかるんでしょうか。

227:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/08 11:44:40
>>227
CSVファイルを扱うならば、Text::CSV をお使いください。
(Text::CSV_XS かもしれない、手元にソースがない)

229:デフォルトの名無しさん
07/01/08 12:25:03
>>228
返信ありがとうございます
Text::CSVモジュールを使わないと対処できないということでしょうか?
フリーのwebスペースを利用したいので、モジュールはインストール出来ないです

Text::CSV自体は優れものみたいですね

230:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/08 13:21:02
>>227
つShift_JISの罠
/\Q$in{'test'}\E/

Text::CSVはマルチバイト文字通ったっけ?
Text::CSV_XSでbinaryオプションを与えない駄目だったような記憶が

232:デフォルトの名無しさん
07/01/08 14:02:13
Text::CSVは0x09(Tab)と0x20(Space)から0x7e(Tilde)の範囲しか使えないね。
Text::CSV_XSでbinaryオプションつけないとダメだ。

233:デフォルトの名無しさん
07/01/08 14:07:57
>>231
返信ありがとうございます。おかげで解決することができました
ただ、「\Q」が「\Eまでのメタ文字をリテラルとして判断する」のは別ったのですが
「/$in{'test'}/」←これのどこにメタ文字があるのかが分らないです
解決はしたけど理解出来てない…

234:デフォルトの名無しさん
07/01/08 14:25:47
>>233
「ー」はShiftJISで0x81 0x5Bと表される。この2バイト目が'[' = 0x5B
他にもソ('\')とか+('{')とか色々。

文字コードの割り当て参考資料
URLリンク(www-cms.phys.s.u-tokyo.ac.jp)

ASCIIコード表
URLリンク(adlib.rsch.tuis.ac.jp)

235:デフォルトの名無しさん
07/01/08 14:31:01
>>233
「$in{'test'}」自体がメタ文字を含むってことじゃなくて、
実行時に変数$in{'test'}にメタ文字を含むShiftJIS文字が入る可能性があるってこと。

236:デフォルトの名無しさん
07/01/08 14:51:17
>>234-235
かなり見当違いな考えをしてたみたいですね
「ー」以外にも注意しなければいけない文字が結構ありますね
ご丁寧にありがとうございました

237:デフォルトの名無しさん
07/01/08 16:52:09
>>230
1: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz <perl@bike-nomad.com>
Provide: Archive::Zip version 1.18
Require: File-Which
Require: PathTools
Repo: trouchelle
CPAN: URLリンク(search.cpan.org)
Installed: 1.18 (perl)
2: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Adam Kennedy (cpan@ali.as)
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: URLリンク(search.cpan.org)
Installed: 1.18 (perl)
3: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz (perl@bike-nomad.com)
Require: Compress-Zlib
Repo: bribes
CPAN: URLリンク(search.cpan.org)
Installed: 1.18 (perl)
こんな感じです。

238:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/08 17:41:21
たまに思うのだが、単なる文字列のスカラを
"$file" とかって、ダブルクォートで括って書くの無駄だよね。
全く同じ内容の、新しい文字列を生成してる訳でしょ?
だったら単に $file って書いた方が効率良いのに。

KENTとか、どっかのサンプルでわざわざ括るようになってるのかな。
こういう書き方してる人が、どこで習ってくるのか知りたい。


240:デフォルトの名無しさん
07/01/08 17:51:09
>>238
$in{'test'}が正規表現の場合の話か。

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

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

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

ついでにperlfaq
URLリンク(www.kt.rim.or.jp)

241:デフォルトの名無しさん
07/01/09 00:43:01
>>239
あ、それ昔やってた。
なんかprint = ダブルクォート括らないと不安、みたいな気がしてたような。

242:デフォルトの名無しさん
07/01/09 00:46:26
#俺にも
print $a, $b; #とすればいいところを
print $a . %b; #としていた時代や
print "$a$b"; #としていた時代があったなあ

243:デフォルトの名無しさん
07/01/09 01:05:55
カンマは直接に文字連結の意味じゃないから余り好きじゃないなぁ。。
そっちの方が速いんだけどね。

244:デフォルトの名無しさん
07/01/09 01:39:08
強制的に文字列コンテキストに変えたいときとか。
オブジェクトじゃなくてその文字列表現だけ保持したい場合とかあるでしょ。

245:244
07/01/09 01:46:32
ちゃんと読んでなかった。スマソ

246:デフォルトの名無しさん
07/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)

247:243
07/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を書いた。
なんで結果違くなっちゃうのか誰か教えて~。

248:243
07/01/09 13:29:23
あー、わかった。Perlでの出力処理はcommaの方が速いけど、
systemのIOでのオーバーヘッドで結果的にdotの方が速いという寸法か。>>246
Windowsで実際にファイルに出力して計測してみると大体同じ(わずかにcommaが速い)になった。
ここらへんはLinuxとWindowsで違うんだろうね。

249:デフォルトの名無しさん
07/01/09 14:06:58
>>246
うんにゃ。

8Bのメモリ確保なら大してコストかからんからサンプルとして不十分じゃないか?。
$hogeが十キロの単位になってくるとカンマが追い抜くんじゃないだろうか。

250:デフォルトの名無しさん
07/01/10 01:42:28
>>248
いや、>>246はSTDERRに出力してるからカンマ区切りが遅くなっているだけ。

STDERRはperl内部でも特別扱いされていて、カンマで区切られた要素毎に fflush される。
なので、STDERRへ出力する場合はカンマ区切りの方が(fflushの増える分だけ)遅くなる。
他のハンドルだと($|=1でも)、普通はカンマ区切りの方が速くなる。

251:デフォルトの名無しさん
07/01/10 04:22:12
えっちだから遅いんだね。

252:デフォルトの名無しさん
07/01/10 15:25:22
フリーウェアのソースを眺めてると、一つのファイルにやたらと機能を詰め込んでるのが
多いように感じるんだけど、これってどうなんだろう。
掲示板だったら、表示.cgi 書込み.cgi とか分けた方が保守しやすいのでは、と。
意見求みまする。

253:デフォルトの名無しさん
07/01/10 15:43:02
>>252
インスコするファイルがたくさんあるとお子様が混乱してしょうもない
質問で邪魔してくるので、ソースメンテする手間はかかるけどトータル
では得らしい。


254:デフォルトの名無しさん
07/01/10 15:51:55
コーディング外の質問です。
今、plファイルのwindows向けのアイコンを何となく作っていますが、
真珠っぽいのがファイルについたアイコンか、らくだの絵のアイコンかどちらがふさわしいと思いますか?

255:デフォルトの名無しさん
07/01/10 16:07:31
当然らくだ

256:デフォルトの名無しさん
07/01/10 16:18:38
PARのparl.exe

257:デフォルトの名無しさん
07/01/10 16:25:41
>>256

258:デフォルトの名無しさん
07/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:韋駄天はふと考えた
07/01/10 23:02:23
あなた達も↓のような経験が一度や二度あるでしょう。私はわずか4年の間に
2回もパソコンをウイルスによって不調になり使えなくなりました。
私達はパソコン製造業者及び修理業者とパソコン関連で商売をしている業者を
あまりにも野放にしすぎました。
その結果が自作自演ウイルスバラ撒きの悪徳商法です。

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

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

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

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

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

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

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

この腐れ外道共が!    恥知らずの犯罪者共めが!

260:デフォルトの名無しさん
07/01/10 23:06:09
>254
でっかく「PL」とか「Perl」の文字が入ってるアイコンとか……。(聞いてない)

261:デフォルトの名無しさん
07/01/11 00:08:30
>>255
公式のらくだの絵をちょっと使って作ってみました。
>>256
あれはそのままでも結構かっこいいのですが、ちょっと抵抗があったので。。
>>260
一応Perlの文字を入れました。

どうもでした。

262:デフォルトの名無しさん
07/01/11 01:01:46
ファイルを最終行から順にさかのぼって読む方法ないですか?
seek , getc等で1文字単位で読むしかないかな?

263:デフォルトの名無しさん
07/01/11 01:09:57
>>262
つFile::ReadBackwards

264:デフォルトの名無しさん
07/01/11 01:15:30
>>263
ありがとうございます。


265:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/11 17:09:13
bに1を足してaをb個並べてプリントしたら改行を繰り返す

267:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/11 17:21:58
あと $a と $b は sort とかで使われるから使うなといっとけ

269:265
07/01/11 17:33:51
>>267
できました。ありがとうございます。
入れ子でわけわからない長いプログラムを作っていた自分がアホらしくなりましたw

もし入れ子でやるとしたら
入れ子の方の後半部分の
print $a;
}
print "\n";
}
はどういうことでしょうか?

270:デフォルトの名無しさん
07/01/11 17:34:37
すぐ答え出す奴ってなんなの・・・

271:デフォルトの名無しさん
07/01/11 17:54:51
漁師さん

272:デフォルトの名無しさん
07/01/11 18:12:08
こういう場合は普通、for文を使わずにトリッキーなコードを書いてあげるのが
お決まりなんだけどね。

273:デフォルトの名無しさん
07/01/11 18:21:32
print map { $a x $_ . "\n" } 1..$b;



274:デフォルトの名無しさん
07/01/11 18:58:59
チューニングした答え書いて分かるかよ。
いっそのことCPANで(笑

275:267
07/01/11 19:02:50
$a='+';$b=5;$t=0;
(${a}x(($b*$b+$b)/2))=~m{((??{++$t;".{$t}"}))(?{print"$^N\n"})}g;

こうですか?わかりません><

276:デフォルトの名無しさん
07/01/11 19:17:38
$^Nなんて使ってるのはじめてみた(笑)

277:デフォルトの名無しさん
07/01/11 19:26:01
(笑)なんて使ってるのはじめてみた(笑)

278:デフォルトの名無しさん
07/01/11 20:25:30
確かにな(藁

279:デフォルトの名無しさん
07/01/11 20:27:11
まぁ、ありえない

280:デフォルトの名無しさん
07/01/12 02:12:36
print map "$_¥n", unpack +( join '', map "A${_}X${_}", 1..$b ), $a x $b ;
不毛だ…

281:デフォルトの名無しさん
07/01/12 02:31:38
$_が半角文字"@"(0x40)を含むときのみデータを取得したいのですが、
以下のコードだと、$_が"病院"(0x95,0x61,0x89,0x40)とかの場合でも
データを取得してしまいます。
このような2バイト文字を取得しないようにするには
どの様に修正すればいいですか?

if ( $_ =~ "@" ) {
 $data[$i++] = $_;
}


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

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

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

渡されてきたURLを「URLリンク(www.xxx.com)」のように、
そのまま表示するにはどうしたらいいでしょうか?

一応書いておくと、スクリプトはUTF-8Nで書いています。

283:デフォルトの名無しさん
07/01/12 04:00:48
>1に全てが隠されているんじゃないだろうか。

284:デフォルトの名無しさん
07/01/12 04:08:40
>>283
orz
CGIはスレ違いだったんですね。本当にごめんなさい。
一日考え続けてて疲れてたのか、>>1を確認するのを失念してました。
向こうの初心者質問スレで質問してくる事にします。
スレ汚し失礼しました。

285:デフォルトの名無しさん
07/01/12 04:14:03
プログラム板から誘導されて来ました。
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz

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

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

渡されてきたURLを「URLリンク(www.xxx.com)」のように、
そのまま表示するにはどうしたらいいでしょうか?

一応書いておくと、スクリプトはUTF-8Nで書いています。

286:デフォルトの名無しさん
07/01/12 04:20:09
ぎゃー!!!
ありえない誤爆・・・。

ほんっとうにごめんなさい・・・。

287:デフォルトの名無しさん
07/01/12 04:23:33
>1に全てが隠されているんじゃないだろうか。

288:281
07/01/12 04:29:08
自己解決しました。
おさわがせしました。

289:デフォルトの名無しさん
07/01/13 00:44:28
>>281見てて、ふと、半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
うーんうーん悩んでいた時のことを思い出した。
そういや、半角英字を全角英字に置換することってできるの?

290:デフォルトの名無しさん
07/01/13 00:53:02
use utf8やるとか。

291:デフォルトの名無しさん
07/01/13 01:42:35
EncodeもあるしUnicode::Japaneseもあるし。

292:デフォルトの名無しさん
07/01/13 22:09:16
WebProg板に書いたけど、こっちの方がふさわしそうなので
こちらでお聞きします。

キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、
C言語でいうところの、getch() に相当する関数はないでしょうか?

293:デフォルトの名無しさん
07/01/13 22:10:05
4年前ぐらいまでPG兼SEをしていたのだが、
そのころと比べるとかなりPerlは寂れた?


294:デフォルトの名無しさん
07/01/13 22:34:22
>>292
Term::Getch

295:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/14 00:49:18
普通にソートすりゃいいやん

@result= sort {(split/:/,$b)[1]<=>(split/:/,$a)[1]} @result;

297: ◆TWARamEjuA
07/01/14 01:04:42 BE:1633853-BRZ(6701)
とん・なん・しゃー・ぺー♪

298:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/01/14 01:23:07
数値として使う予定の変数を、文字列で宣言するのって確か非効率だよね。

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

…だったような気がする。

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

皆様、すばらしいご教授、どうもありがとうございました。


301:デフォルトの名無しさん
07/01/14 01:59:22
>>299
perl は型はなしでしょ。
$foo = '2000';

$foo = 2000;
は同じでしょ。

302:デフォルトの名無しさん
07/01/14 02:13:38
>>301
つ [perlguts]
つ [Devel::Peek]

303:デフォルトの名無しさん
07/01/14 02:45:43
>>302
もちっと教えてくれんかのう。
perldataには
「あるスカラー変数が、“文字列”型、“数値”型、“ファイルハンドル”型、
あるいはその他の型であるように宣言する方法はありません。」
とあるかんだけど、それとは違うレベルで何かあるのか?

304:デフォルトの名無しさん
07/01/14 03:03:20
提示されている情報ぐらい見なさい。
> Double-Typed SVs
> スカラー変数は通常、整数、倍精度、ポインタ、リファレンスのうちの いずれか一つの型をとります。Perl は実際のデータに対して、
> 蓄積されている型から要求されている型へ、自動的に変換を行ないます。

305:265
07/01/14 03:39:50
>>275 を提出したんですが、授業後
せんせから呼び出し受けました。

306:303
07/01/14 03:57:55
>>304
どうもありがとう。
文脈によってperl内部で数値と評価されたり文字列として評価されたりすることは分かっています。
しかし、シンタックス上
$foo = '2000';

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

#$foo = '2000' . '';
#と
#$foo = 2000 + 0;
#が違うのはわかりますよ。

307:303
07/01/14 04:24:03
試してみれば良いんだね。
$foo = 2000;
の場合数値コンテキストになるんだ。(そりゃそうか)

308:デフォルトの名無しさん
07/01/14 13:40:27
>>305
ワロタ
なんていわれたの?w

309:デフォルトの名無しさん
07/01/14 14:38:20
先生が読めなかったか
先生がこのスレを見ていたか

どっちかな

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

次スレのテンプレ予定の>>115に忠実に従えば、
tr/a-zA-Z/a-zA-Z/
でできる。

311:デフォルトの名無しさん
07/01/14 14:58:44
print "@{[1+1]}", "${\(1+1)}";

こういうテクニック(?)を思い出したんですけど、どこに書かれていたものでしょうか。

312:デフォルトの名無しさん
07/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

313:299
07/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:デフォルトの名無しさん
07/01/14 22:35:50
>>313
実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。
URLリンク(search.cpan.org)
use Contextual::Return;

$contextual = NUM { 10 } STR { 'abc' };
print $contextual . '';
print $contextual + 0;

315:314
07/01/14 22:43:39
ああ、失敗。よく考えたら流石に代入は無理だな。…Tie使ったら或いは出来たりしそうな気もしないでもない。
313はスカラを作ると言うことで代入した別の値を保持まで出来たりするのかな

316:デフォルトの名無しさん
07/01/14 23:55:02
Scalar::Utils の dualvar は?

317:デフォルトの名無しさん
07/01/14 23:56:11
ごめん、Scalar::Util だった。
URLリンク(search.cpan.org)

318:デフォルトの名無しさん
07/01/14 23:59:37
>実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。
スルーしてた。xs を使って実現したのが Scalar::Util の dualvar ってことっすね。

319:デフォルトの名無しさん
07/01/15 00:09:24
dualvar でスカラ作ってみたけど、
作った後で代入し直したら、片方だけ(数値だけ or 文字列だけ)になっちゃった。

ということは、xsでフラグいじって IOK, POK 両方立てても
代入したら片方になっちゃうということか。
オブジェクトにして代入まで見張れば良いんだろうけど。

320:デフォルトの名無しさん
07/01/15 01:57:29
webサーバをan httpdからapacheに変更したところ文字化けする部分が出てきました。
method=getで受けとった部分が文字化けしてしまいます。method=postは大丈夫でした。
よろしくお願いします。
↓の一番下の部分も参考にしましたが直りませんでした。
URLリンク(tech.bayashi.net)
apache perlは↓のサイトを参考に構築してあります。
URLリンク(www.y-kit.jp)
------------------------------
環境
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データ
URLリンク(localhost)あいうえお&a=11
表示データ
name=a&mail=&message=???¢???|?¨&ip=&a=11

321:デフォルトの名無しさん
07/01/15 02:03:07
>1に全てが隠されているんじゃないだろうか。

322:デフォルトの名無しさん
07/01/15 12:39:35
以前使っていたサーバでdbmファイルを使っていたのですが、
そのまま別のサーバに移動したら読み込めなくなりました。
dbmファイルは.dirと.pagの2つじゃない方(1つのファイル)です。
古いサーバはもう使えません。新しいサーバでdbmファイル
を読む方法はないでしょうか…。

323:デフォルトの名無しさん
07/01/15 14:43:05
>>322
質問する時はまず環境を説明しろ!
(古い方と新しい方それぞれのOSの種類とバージョン,Perlのバージョン)

あと、読めなくなったってのはどんなエラーメッセージが来てるのかも報告汁

324:デフォルトの名無しさん
07/01/15 19:18:22
>>322
ヒントになるかわからんが
NDBM_File
DB_File
GDBM_File
SDBM_File
ODBM_File

325:320
07/01/15 20:46:35
別のとこで質問してきます。

326:322
07/01/15 20:58:26
読めなかったと思ったら読めました。お騒がせしました。
dbmファイルはテキストなどに書き出しておかないとバイナリでサーバを移しても
読めないのだと思っていました。dbmopen()で読み書きしていたので、どの
形式のDBMかわからなかったのです。

327:デフォルトの名無しさん
07/01/16 05:56:00
perlerのエロイ人教えて!ワッフルワッフル

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

環境: Windows XP + ActivePerl5.8.8 build819


328:デフォルトの名無しさん
07/01/16 07:04:48
esperのエロイ人が来て
お前の書いたスクリプトを透視した上で回答してくれるのを待つことだ

329:327
07/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:デフォルトの名無しさん
07/01/16 10:58:29
名前が長いファイルの例は何ですか?

331:デフォルトの名無しさん
07/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;

332:327
07/01/16 11:19:46
>>330
全角数字0から9を繰り返すのを160文字 + .txt
のファイル名を用意したら再現しました。
全角数字100文字の場合はファイル名が取得できました。
パスは
D:\test
で実験しました。
95系は絶対パスで255byte以下、
NT系は絶対パスで255文字以下と認識してるのですが
このへんの絡みですかね?


333:327
07/01/16 11:26:39
>>331
Net::FTP::Fileにisfileとisdirってメソッドあるよ。
インスコするかインスコできないならCPANでソース閲覧して参考にすればいけるのでは

334:327
07/01/16 12:18:54
似たケースを見つけた。
ActivePerlのバグ?
URLリンク(www.namazu.org)


335:デフォルトの名無しさん
07/01/16 12:31:39
バグではなく仕様。
WinAPIでも使っとけ。

336:331
07/01/16 13:23:32
>>333
出来ましたー。
最初ソース見て作ろうと思いましたが
面倒臭くなって結局インスコしましたw
ありがとうございます。

337:327
07/01/16 13:44:46
>>336
もめでとう! こっちはいまだにはまり中 orz

>>335
バグじゃなくて仕様なの?
ちなみにWin32::APIを使ってみたけどなぜか取得できない。。。

338:327
07/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__


339:327
07/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:デフォルトの名無しさん
07/01/16 13:56:31
この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。
この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、
パスの前に "\\?\" という接頭辞を追加してください。
詳細については、MSDN ライブラリの「File Name Conventions」(ファイル名の規則)を参照してください。

341:327
07/01/16 14:45:03
>>340
どもです、自分もおんなじ情報に行き当たりました ;p
URLリンク(mag.autumn.org)

Find(?:First|Next)FileじゃなくてFind(?:First|Next)FileWを使えってことなんですね。。。
ディレクトリのファイル一覧を取得する部分だけで苦労するな。。。

342:デフォルトの名無しさん
07/01/16 14:51:49
>>327
URLリンク(msdn2.microsoft.com)
typedef struct _WIN32_FIND_DATA {
...
TCHAR cFileName[MAX_PATH];

343:デフォルトの名無しさん
07/01/16 23:00:35
作ってもらった

    __
    |   |
    |   |   ___                  ___
    |   | .  /     |  __    _____   / _  \
    |   |  /  /|  |  /  /   / ____/  / /  >  l
    |   |. /  / .|  |. /  /   / /..   _    /   ̄  /
    |   |/  /  |  |/  /   /   ̄ ̄_/   /      \
    |       /.   |     /   / / ̄ ̄ __   /  / ̄ ̄>  |
    |    /   |___/  ./   ̄ ̄ ̄ /  /    ̄ ̄  /
     ̄ ̄ ̄             ̄ ̄ ̄ ̄ ̄     ̄ ̄ ̄ ̄ ̄     _____      ___ ___    ___
    ______                             /__  __/ [][] _| |_| |__ _| |_
     |  ___  \                               / /     |    _  | |_  レ'~ ̄|
     |  |    \  l                              |  |_      ̄|  | / / /   /| |
     |  |____/  /                             \__|      |  |  ̄ /_  /.  | |_
     |  ____/ ___  __    __/ヽ                    |_|.     |__|.   \/
     |  |     /`、_/_/ / _ ヽ  / _  /
     |  |     ヽ  /   | l   l l  | l   l l
     |  |       | l     ヽ  ̄ /  ,ヽ  ̄ /
      ̄          ̄      ̄ ̄  / __ ヽ
                        | l     l l
                        ヽ  ̄ ̄ /
                         ~ ̄ ̄~

344:デフォルトの名無しさん
07/01/16 23:04:28
ちょっとでかいな

345:327
07/01/17 01:05:42
ActivePerlではうまくいかないみたい。。。
URLリンク(aspn.activestate.com)

346:327
07/01/17 06:15:16
URLリンク(aspn.activestate.com)
こちらのやり方で取得出来ました。

何度も自己レスすみませんでした m(_ _)m



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch