トップページ⇒php
1001コメント362KB

Perlコーディング初心者質問スレ Part 40

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/01/27 18:08:42ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
044944705/02/15 23:00:54ID:???
&hoge("2ch");
&hoge("yahoo", "損", "氏ね");

sub hoge($;@){
 unless( $_[1] ){
  print "オマエモナー\n";
 }else{
  print "@_\n";
 }
}

じゃ、ダメかい?
0450T女の竹田05/02/15 23:13:38ID:???
>>444
どのくらい共通でどのくらい共通じゃないか、
もうちょっとわかりやすい例にならない?
>>444では共通の処理がないからピンと来ないよ。
045144405/02/15 23:43:31ID:???
一箇所だけ例外処理があって、その例外処理の部分で複数の引数が必要になるんですが、、、
共通の処理の方がかなり多いです。
うーんどんな例を出せば良いんだろう
0452nobodyさん05/02/15 23:48:36ID:???
>>450
ありゃ、あんた中国語板にいなかったっけ?
0453nobodyさん05/02/16 00:30:45ID:???
画像ファイルをアップロードする為に
enctype="multipart/form-data"としているのですが
一緒に文章を受信しようと
cgi-lib.plのReadParseで読んだデータを表示してみると
Content-Disposition: form-data; name="comment"
となっていて、フォームに入力した文字がありません
どうすれば一緒に受信できるのでしょうか?
0454nobodyさん05/02/16 01:29:29ID:???
>>421
正直、リファレンスで参照しろよと言いたいけど
どうしてもいやなら、こんなサブルーチンを作るといい!

sub deref{
for my $hash( @{ $_[1] } ){
%{ $hash } = %{ shift @{ $_[0] } };
}
};

testサブルーチンの戻値がハッシュのリファレンスのリストだとするとこうかける。

deref( [ test() ] => [ \%y1, \%y2, \%y3 ] );

または

deref( [ test() ] => [ \( %y1, %y2, %y3 ) ] );
0455nobodyさん05/02/16 11:54:53ID:MwHh4jT0
現在のページがSSLかどうかを判断することは不可能ですか?
現在のページがSSLかどうかが入ってる環境変数はないのでしょうか?
0456nobodyさん05/02/16 12:59:07ID:???
>>455 $ENV{'HTTPS'}
0457nobodyさん05/02/16 14:03:39ID:???
2つファイルがあって、中身はメールアドレス
そいつを、一行ずつ比較して同じなら削るPerl、、、

すまん、本職絵描きなんで誰か教えてくれ。
0458nobodyさん05/02/16 14:21:03ID:???
my @array = qw/1 2 3/;
この配列の要素それぞれに2を足した数字を表示させたいです。

print map{return $_ + 2}@array;
としてみましたが、何も返されてませんでした;
どうにか変数などには入れず、@arrayの元々の値も変えずにできないでしょうか?
0459nobodyさん05/02/16 14:21:20ID:???
>>457
違う行にある場合は削らないの?
同じ行毎の比較のみ?
で、削るのは2つのファイル両方から削るの?
それとも二つのファイルから重複しないアドレスリストを求めたいわけ?
もちっと詳しく
0460nobodyさん05/02/16 14:21:50ID:???
>>457
if ($a eq $b) { undef $b }
0461nobodyさん05/02/16 14:22:58ID:???
>457
マルチポストうざい。

http://pc5.2ch.net/test/read.cgi/hp/1106947416/177n
0462nobodyさん05/02/16 14:26:26ID:???
>>458
my @array = qw/1 2 3/;
print map{$_ + 2}@array;
print "\n";
print @array;

--result
345
123
046345805/02/16 14:26:45ID:???
returnがいらないだけでした
046446105/02/16 14:35:48ID:???
T-T
046545805/02/16 14:37:22ID:???
>>462
すいません;

これって
$hoge =~ s{}{}e;
これの右ブロックの中で使うにはどうすればいいですか?
$hoge =~ s{^([^\n]*)}{$1.
(join '',map〜).
"終端"
}e;

こんな感じで一応できましたがわざわざjoinしないといけないのがちょっと;
しかし強制的にスカラー評価されるところではこの方法以外にないのでしょうか?
046645805/02/16 14:43:22ID:???
すみませんできましあ。
0467nobodyさん05/02/16 14:54:21ID:???
>>457
その程度ならcomm(1)使え。

0468nobodyさん05/02/16 14:58:35ID:???
>467
マルチ野郎はスルーしる
0469nobodyさん05/02/16 20:09:14ID:???
ディレクトリs1の下にa1とa2を作り
a1にあるXXX.plファイルをa2にあるPPP.cgiから
参照しようとしています。

PPP.cgiの中で
require "../a1/XXX.pl";

とするのは良いのでしょうか?

Copalだとエラーが出てしまいます。
0470nobodyさん05/02/16 20:12:47ID:???
質問です。

$str =~ s/${value}/hoge/g;

をやるときに、$value の値に正規表現の制御文字(^$.[]…等)が
入っていると置換時にエラーとなってしまいます。

$value 内の文字をそのまま扱いたい場合はどのようにすればよいのでしょうか?
置換前に、$value の中の制御文字を全てエスケープするのかなと思いましたが、
他に簡単な方法があればご教授下さい。
0471nobodyさん05/02/16 20:44:55ID:???
>>469
よいでしょう。

>>470
$str =~ s/\Q$value\E/hoge/g;
0472nobodyさん05/02/16 21:02:41ID:???
>>471
ありがとうございます。
すみません、一つ忘れてました。。

$str =~ s/%__${value}\.begin__%(.+?)%__${value}\.end__%/hoge/g;
のような用途を予定しています。

\Q〜\E 内が全てエスケープされてしまうので、
本来使いたい正規表現が無効になってしまいますね…。

やはり変数個々に対してエスケープでしょうか。
047347205/02/16 21:24:45ID:???
自己レスです。

$str =~ s/%__${value}\.begin__%(.+?)%__${value}\.end__%/hoge/g;

を

$str =~ s/\Q%__${value}.begin__%\E(.+?)\Q%__${value}.end__%\E/hoge/g;

にすることで解決できたようです。(ホントに大丈夫かな…)
ありがとうございました。
0474nobodyさん05/02/16 22:15:30ID:???
事前に $pattern =quotemeta $value; しちゃダメ?
047546905/02/16 22:41:10ID:???
>>472
ありがとうございます。
端末の設定をもう一度見直して見ます。
0476nobodyさん05/02/17 00:24:07ID:???
正規表現でよくでてくる =~ はどういう意味ですか?
0477nobodyさん05/02/17 00:58:33ID:???
パターン結合演算子がなぜ = と ~ の2文字の組み合わせなのかを知りたいのか?
0478nobodyさん05/02/17 06:25:30ID:???
>>476
左項に対して右項でパターンマッチを行う演算子。
0479nobodyさん05/02/17 09:24:23ID:???
$hoge = "hoge1,hoge1,hoge1,\n";
@array = split(/,/,$hoge);
$array[1] = "hoge2";
$hoge = join(",",@array);

カンマで区切られた$hogeの指定個所を変更したいのですが、
今は上記のように、分割→変更→結合と3行に渡って行っています。
これをもっと効率の良い方法でやる事はできますでしょうか?
0480nobodyさん05/02/17 10:40:36ID:ICaDRbeT
改行をprintで出力するにはどうすればいいですか?
print "hoge\nhoge";
とやると、
hoge\nhoge
とそのまま表示されてしまうんですが、なにか間違いがあるんでしょうか。
0481nobodyさん05/02/17 10:48:59ID:???
>>480
エスケープする
print "hoge\n\hoge";
0482nobodyさん05/02/17 11:31:00ID:???
>>480
ネタだろ?
0483nobodyさん05/02/17 12:28:14ID:???
>>480
print "hoge<br>hoge";
0484nobodyさん05/02/17 12:29:02ID:???
print "hoge<br></br>hoge";
0485nobodyさん05/02/17 13:43:38ID:???
>>479
この処理だけ100万回やるので全体の処理時間がここで決まるとかじゃなければ
あまり気にしてもしょうがないと思うが、

use Benchmark;

timethese(undef, {
SPLIT_JOIN => sub {
my $hoge = "hoge1,hoge1,hoge1,\n";
my @array = split(/,/,$hoge);
$array[1] = "hoge2";
$hoge = join(",",@array);
},
SUBSTITUTE => sub {
my $hoge = "hoge1,hoge1,hoge1,\n";
$hoge =~ s/,[^,]*/,hoge2/;
},
INDEX_SUBSTR => sub {
my $hoge = "hoge1,hoge1,hoge1,\n";
my $pos1 = index($hoge, ',')+1;
my $pos2 = index($hoge, ',', $pos1);
substr($hoge, $pos1, $pos2-$pos1) = 'hoge2';
},
});

Benchmark: running INDEX_SUBSTR, SPLIT_JOIN, SUBSTITUTE for at least 3 CPU seconds...
INDEX_SUBSTR: 3 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 222680.89/s (n=699218)
SPLIT_JOIN: 4 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 108552.56/s (n=338684)
SUBSTITUTE: 3 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 188749.53/s (n=602111)

0486nobodyさん05/02/17 14:31:44ID:???
>>485
ベンチマークまでありがとうです。
hoge2が計算式だったり、要素数が多かったりする事も考慮すると、
見易さの面(個々によると思いますが)でも、今まで通りでOKみたいですね。

(空想の関数/,/,$hoge)[99] = $age + $sage;
みたいな感じで$hogeをカンマで区切った場合、
要素100番目の位置にダイレクトに代入できる技が無いものかと思いまして。
0487nobodyさん05/02/17 16:18:01ID:lgJIuLRQ
my %a = (a=>1,b=>2,c=>3);
print $a{a,b,c};

こういう感じでハッシュも配列みたいにいっぺんに呼べるカナと思いましたが、
エラーでした;
@a{a,b,c}や%a{a,b,c}もやりましたがダメでした。

ハッシュって
print $a{a},$a{b},$a{c};
のようにいちいち一つずつでしかできないのでしょうか?
0488nobodyさん05/02/17 16:33:32ID:???
スライスとか

@a{'a', 'b', 'c'}
0489nobodyさん05/02/17 16:36:41ID:???
@{[%hash]}
使い道ないかもしんないけどこういうのも
049048705/02/17 16:43:51ID:lgJIuLRQ
>>488-489
クォートでしたか。
@a{qw/a b c/};
こんな感じですね^^
0491nobodyさん05/02/17 16:56:59ID:???
>>487
strict subsしているときは、サブルーチンとして
宣言されていない裸のワードの存在が許されるのは
「{}」の間に単独で存在するときと、「=>」の左側
だけ。

Bareword "a" not allowed while "strict subs" in use at ほげほげ

って感じのエラー出てたはずだからちゃんとよめよ...

エラーメッセージの意味わかんない人は、ラクダ本の
診断メッセージって章にアルファベット順に意味と並
べて書いてあるので調べる癖をつけましょう。
0492nobodyさん05/02/17 18:15:10ID:???
Windows2000
Apache 2.0.52
perl ActivePerl 5.8.6.811

クライアントの要求のヘッダを取得したいのですが出来るものでしょうか?
WEB サーバーからのヘッダは取得は出来たのですが、今やりたい内容ではないですし …

ご教授よろしくお願いします。
0493nobodyさん05/02/17 20:37:53ID:???
>>492
前に HTTP_ をつけて環境変数 %ENV にはいるよ
0494nobodyさん05/02/18 01:51:05ID:???
>>486
そうであればこんな正規表現があるけど

$hoge = "hoge1,hoge1,hoge1,\n";
$hoge =~ s/((?:[^,]*,){1})[^,]*/$1hoge2/;

これで前から2番目の「hoge1」が「hoge2」に置き換わる。
{1} の部分を
{0} とすれば先頭の「hoge1」が「hoge2」に置き換わるし
{2} とすれば前から3番目の「hoge1」が「hoge2」に置き換わる。
{3} とすれば最後のカンマの後ろに「hoge2」が追加(改行が置き換わる)されるし
4以上の数字を指定すと置換えは行われない。

カンマの数が増えれば置き換え対象の指定位置も増える。
0495nobodyさん05/02/18 01:54:39ID:???
>>494の続き

(空想の関数/,/,$hoge)[99] = $age + $sage;

みたいにしたければ

$hoge =~ s/((?:[^,]*,){99})[^,]*/$1.($age + $sage)/e;

ってやればよい。
0496キヨ05/02/18 04:51:35ID:wywZhzNy
回答者の皆さまはじめまして。
�@:やりたい事
データがカンマ区切り","されていない形式で、
データをソートして表示したい

4 平野 298 3
3 辻 286 5
2 秋山 325 26
1 清原 304 38

�A:やってみた事
各項目別にソートしたいのですが、

@mem = sort { (split(/\,/,$a))[0] <=> (split(/\,/,$b))[0] } @mem;
foreach $mem (@mem) {
($no,$name,$avr,$hr) = split(/\t/, $line);
(各処理)
}
現在、$noに関してソートして表示できています。
上記の[0]の部分を[2]に変更すると、$avr項目に関してソートできると思ったのですが
うまくいきません。
データの拡張子は.logですが、excelで開くと綺麗に並んで表示されます。
","で区切られていないと上記の処理は出来ませんか?
それとも、","の区切りは関係なく、別の問題なのでしょうか?
0497nobodyさん05/02/18 05:26:56ID:qmmO8oMV
Perlでフリーソフトを作ってます。
モジュールに頼らずに入力されたパスフレーズをSHA1かけてファイルに保存しようと思ってます。
再配布可能でSHA1ハッシュ値を計算するサブルーチンをwebで検索したところ
ttp://www.mirrors.wiretapped.net/security/cryptography/algorithms/rc4/arcfour.pl
こちらでsha1サブルーチンがあったので、ちょっとここのサブルーチンを拝借して
$string = "ax";
print sha1($string);
という風にテストしてみたところSHA1ハッシュ値とは全然違う文字列が出力されました。
どのようにすればちゃんとしたSHA1ハッシュ値が得らるのでしょうか?
0498nobodyさん05/02/18 05:36:15ID:???
>>496
「データがカンマ区切り","されていない形式で」っていっているんだから
sort の中の split で","分割しちゃだめでしょ。
0499キヨ@49605/02/18 06:50:20ID:wywZhzNy
>>498
有り難うございます!
splitの\,を\tに変えたら作動しました!!
5〜6時間近く悩んでいたのに…。
本当にありがとう御座いました!!
050048605/02/18 08:42:07ID:4JcRNkuB
>>494-495
親切な人ありがとー
一行でやるには関数では無くて、正規表現でやる事になるのですね。
勉強になりました。
0501nobodyさん05/02/18 09:39:28ID:???
DBI周辺質問
SELECT * FROM TEST_TABLE;
これで全レコードのゼンフィールドを取得したとして。
@arrayの中に全レコードのhogeフィールドだけをデリファレンスして入れたい。
hogeフィールドは0番目だと仮定。

fetchall_arrayrefで返されるのが配列リファレンス。更に中に配列リファレンスなので

my @array = @{@{$sth->fetchall_arrayref}[0..$#{$sth->fetchall_arrayref}]}[0];

とかでいけるかと思いきやダメでしたorz
誰かわかる方いますか?
0502nobodyさん05/02/18 09:48:08ID:???
ろくに読まないでレス。

my $rows = $sth->fetchall_arrayref;
my @array = map { $_->[0] } @$rows;
050350105/02/18 10:21:48ID:???
>>502
ありがとうございます。
変数作るの機雷なんで
my @array = map { $_->[0] } @{$sth->fetchall_arrayref};
としておきました。

もう一つお願いします。
sprintfで
$str = sprintf %d+100.%d-20.%d,@list;

こういう風に配列の中身にそれぞれ別の数字を足したり、文字列を付加したりしながらの
整形って不可能ですか?上記ではエラーでしたが;

やりたいことは
$str = $list[0]+100.$list[1]-20.$list[2];
です
0504nobodyさん05/02/18 10:39:33ID:???
truncate関数ってflockと同じくらいプラットフォームによって使えるかが左右される関数ってほんと?
050550405/02/18 10:47:26ID:dVwgIF/D
上げ忘れた。
truncate関数がダメならそれ以外で
open FH,"+<test.txt";
flock FH,2;
この状態のファイルの中身を一旦0にすることはできますか?

ファイルを上書きモ−ドで開くのは不可能です。このファイルを開いてる間に
処理内容が重複しては困ることをしてるので。
050650405/02/18 11:31:10ID:dVwgIF/D
あれ・・・誰もいないのかな・・・
0507nobodyさん05/02/18 11:45:10ID:???
>>504
そんな話聞いたことが無いけど釣りですか
050850405/02/18 12:14:53ID:dVwgIF/D
>>507
失敬な!
http://perl.misty.ne.jp/function02/truncate.html
http://www.7key.jp/program/perl/truncate.html
0509nobodyさん05/02/18 12:16:49ID:???
--- original.pl ---
require './lib/lib1.pl';

--- lib1.pl ---
require './lib/lib2.pl';
open( FILE, "< file.txt" );

というファイル/ソースの時に、
original.pl を実行すると、
どこの file.txt, lib2.pl を読むのでしょうか?

この辺の位置関係を解説してるサイトがあれば
すみませんが教えてもらえると助かります。
0510nobodyさん05/02/18 12:24:30ID:???
俺Perl書けないけど試せば答えられそうだな
0511nobodyさん05/02/18 12:26:03ID:???
>>510
お前なんでここにいんの?
0512nobodyさん05/02/18 12:44:04ID:???
>>503
$str = sprintf '%d%d%d', sub{ $_[0]+100, $_[1]-20, $_[2] }->(@list);

#応用
$str = sprintf '%d/%02d/%02d %02d:%02d:%02d', sub{$_[5]+1900,$_[4]+1,@_[3,2,1,0]}->(localtime);
051350705/02/18 13:27:25ID:???
>>508
いやflockが使えないOSは聞いたことがあるがtruncateが使えないOSは聞いたことが無いってこと。
051450305/02/18 13:29:28ID:???
>>512
おお!
凄いですねそれ。どうなってるんですか?
無名関数のリファレンスを作ってるみたいですが、どうして->(リスト)が
引数として渡されるんでしょう?
0515nobodyさん05/02/18 13:54:42ID:???
print @hairetu[0..6];
これの降順ってのは無理?
print @hairetu[6..0];
for(0..2)の仕組みと同じっぽいから無理だと思うけど、ここならもしかして知ってる人がいるかもと期待してきてみた。
0516nobodyさん05/02/18 13:59:39ID:???
>>511
m9(^Д^)プギャーーーッ
0517nobodyさん05/02/18 14:00:30ID:???
reverse
0518nobodyさん05/02/18 14:19:43ID:???
>>514
$code = sub{ $_[0]+100, $_[1]-20, $_[2] };
@list2 = $code->(@list);
$str = sprintf '%d%d%d', @list2;

これを一行にまとめているっていうのは理解できるよね。

参照演算子 "->" は、左辺値が関数リファレンスであれば
右辺に "()" を記述して関数を間接実行できる。
同様に左辺値が配列リファレンスであれば
右辺に "[]" を記述して配列要素を間接参照できるし
左辺値がハッシュリファレンスであれば
右辺に "{}" を記述してハッシュ要素を間接参照できる。

これは左辺値の評価結果が関数リファレンスでありさえすれば
"->()" でいつでも間接実行が行えるということ。

"sub{}" は無名関数リファレンスの値を持っているわけだから
無名関数を定義したと同時に実行させただけということになる。

もちろん関数を実行させているわけだから
"()" 内に指定したリストが引数として渡る。
0519nobodyさん05/02/18 14:33:12ID:???
>>515
>>517が示しているリスト関数を使う。

print @hairetu[reverse 0..6];
052050305/02/18 14:36:44ID:???
>>518
そういうことでしたか。わかりやすい説明ありがとうございました!
@{[]}や${\()}なんかと同じ位価値のある色々使えそうなテクですね^^
0521nobodyさん05/02/18 14:39:12ID:???
>>517>>519
長い名前だね。[6,5,4,3,2,1,0]も[reverse 0..6]も変わらないorz
とにかくレスサンクス
0522nobodyさん05/02/18 15:01:18ID:???
>>520
> @{[]}や${\()}なんかと同じ位価値
そんなのが好きならこんなのもあるよ

${\do{}}

文字列のなかにブロック処理を記述できる。

$x = 1;

$str = qq(これは!${\do{
if($x){
"真";
}else{
"偽";
}
}}です\n);

print $str;
0523nobodyさん05/02/18 15:03:28ID:???
ベンチマークっていうのを取ってみたいんですが、そのモジュールの使い方を
日本語で説明シテルサイトありませんか?
0524nobodyさん05/02/18 15:05:54ID:???
>>523
モジュールメイデケンサクシテミナサイ
052552305/02/18 15:16:10ID:???
http://www.pure.ne.jp/~learner/program/Perl_tips.html#benchmark

ここに比較はかいてありましたが、何秒かかったかのやり方はどこあないでしょうか?
052652305/02/18 15:33:48ID:???
http://hio.jp/tips/perl/perldoc-5.8.0/lib/Benchmark.html#SYNOPSIS

英語読めませんが
timestr()
timethese()
timeit()
timethis()
ってBencmarkの関数ですか?どうしてパッケージ名なしで呼べるのでしょうか?

それと
my $code = sub {
my $a = "あいうえおあかかうskslkdjfんgsjfgsjfdbgsdfはfはfd";
$a =~ s/(\x45)/$1\x46/g;
};
timethis(100,$code);
としたら
timethis 100: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) (warning: too few iterations for a reliable count)
こんなんでました。警告文は多分「しんらいできるカウントのためにあまりに少ない繰り返しなのでとてもできない。」
的な感じだと思いますが、秒数はこれで求めれるので主か?

単に処理が短いからbヴェンチもくそもあるかと文句をいわれてるのでsyか?>
0527nobodyさん05/02/18 15:41:40ID:???
>>526
うん
0528nobodyさん05/02/18 16:50:42ID:???
>>526
>どうしてパッケージ名なしで呼べるのでしょうか?

モジュールがuseされた時にデフォルトのパッケージ関数が
呼び出し側にエクスポートされるようにモジュール側で記述されているから
呼び出し側でモジュールをuseするとパッケージ関数がインポートされて
パッケージ名を明示しなくても関数が使用できるようになる。

下のは正式なエクスポート方法ではないけど、エクスポートの真似事ができる。
実行するとtestサブルーチンが定義されてないとのエラーメッセージがでるが
コメントマークを外すとTESTパッケージのtest関数が実行できる。

package TEST;

#$main::{test} = \&test;

sub test{
print @_;
}

package main;

test(1,2,3);
0529nobodyさん05/02/18 16:53:37ID:???
>>528はちょっち失敗、これでどうかな

package TEST;

$main::{test} = \&test ;

sub test{
print @_;
}

package main;

test(1,2,3);
0530nobodyさん05/02/18 20:21:21ID:???
>>509
http://www.harukaze.net/~mishima/perl/man/perlvar.1.html
> @INC 配列 @INC には、do EXPR、require、use によって評価す
> る Perl スクリプトを探す場所のリストが納められていま
> す。 初期状態では、コマンドラインスイッチ -I の引数
> とデフォルトの Perl ライブラリディレクトリ (おそらく
> "/usr/local/lib/perl5") とカレントディレクトリを表わ
> す "." を順につなげたものです。
0531nobodyさん05/02/18 20:38:12ID:???
> file.txt
こっちはカレントディレクトリ。
CGIの場合、UNIX環境であれば動作しているスクリプトと同じディレクトリ。
ただし、mod_perlの場合は違うから注意が必要。

http://www.ietf.org/rfc/rfc3875.txt
7.2. UNIX
For UNIX compatible operating systems, the following are defined:

> The current working directory
> The current working directory for the script SHOULD be set to the
> directory containing the script.
053250305/02/18 23:08:18ID:???
>>522
そのテクもありがたく頂きますm(_ _)m
0533nobodyさん05/02/19 12:26:16ID:???
使える小技集めたサイトあったらいいな。

個人的には...split /&/......こういうデフォルトで$_を引数にとる関数が好き。
何でpushはとらないんかね。shifth取るくせに。
0534nobodyさん05/02/19 13:41:26ID:???
>>533
shiftが暗黙に対象とするのは@_だろ。
pushは第二引数が配列でもいいからじゃねえか?
0535nobodyさん05/02/19 15:55:05ID:???
>>533
そっか。
ところで$_,@_の中身がセットされるときと削除される時のことを
詳しく説明してるサイトをどっかで見た気がするけど忘れてしまった。
誰か知らない?日本語のサイトなんだけど。
0536nobodyさん05/02/19 19:19:29ID:???
>>535
$_ は、map,grep を使ったときに、または、foreachで$_ が参照変数になったとき暗黙のlocal対象になるよ。
foreachで$_ 意外の参照変数を明示したらlocal対象にはならないけどね。

@_ は、サブルーチン内で暗黙のlocal対象になるよ。
だから、呼出されたサブルーチン内から呼出し元の@_の値を得ることはできない。
しかし、サブルーチン内でブロックがないまま、@_ にlocalを明示すると
呼出されたサブルーチン内のlocal前の@_ の値が、呼出し側の@_ に移るよ!
0537nobodyさん05/02/19 19:20:29ID:???
@_ = 0..9;
print "@_\n"; test1(); print "@_\n"; test2(); print "@_\n"; test3(); print "@_\n";

sub test1{
@_ = 10..19;
}

sub test2{
@_ = 20..29;
{
local @_;
}
}

sub test3{
@_ = 30..39;
local @_;
}

実行結果出力
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
30 31 32 33 34 35 36 37 38 39
0538nobodyさん05/02/19 22:54:09ID:???
maildropが入っているサーバで.mailfilterにto "|/home/username/example.pl"と書いて、メールをexample.plに渡しています。
$ENV{'LINES'}にメールの行数、$ENV{'SIZE'}にメールのバイト数が格納されているのは確認しましたが、メール本文がどこにあるかわかりません。

メール本文がどこに格納されているのかご存知の方がいましたら、教えていただけないでしょうか?
0539nobodyさん05/02/20 08:10:37ID:???
use strict; の状況下でグローバル変数を使用したい場合は、
use vars を使用しますが、これでは require した外部ライブラリでも使用できてしまいます。
引数として渡した変数以外は外部ライブラリに参照させないことはできますでしょうか。
よろしくお願いします。
0540nobodyさん05/02/20 09:05:42ID:???
package
0541nobodyさん05/02/20 13:26:09ID:???
そのファイル内でグロバール的に使いたいだけなら、use vars使わずに
サブルーチン外で普通に my しとけばいいと思うけど。
0542nobodyさん05/02/20 15:17:15ID:O52bAFUw
配列からランダムに1つ要素を抜き出すためにはどうすればいいですか?

@foo = qw(テスト Perl 適当);

$bar = $foo[int rand $#foo+1];

これより簡単になりますか?
0543nobodyさん05/02/20 15:52:41ID:???
$bar = $foo[int rand @foo];
0544nobodyさん05/02/20 16:28:38ID:???
$bar = $foo[<>];
0545nobodyさん05/02/20 16:55:45ID:???
>>542
$bar = $foo[ rand @foo ];
0546nobodyさん05/02/20 17:53:43ID:FLHTnHy4
(http://hoge/1.jpg,http://hoge/2.jpg,http://hoge/100.jpg,http://hoge/200.jpg)
というふうに配列をソートしたいのですが、
普通にソートすると、
(http://hoge/100.jpg,http://hoge/1.jpg,http://hoge/200.jpg,http://hoge/2.jpg)
というふうになってしまいます。
よい方法はありませんか?
0547nobodyさん05/02/20 18:11:11ID:???
>>546
numetric sort
0548nobodyさん05/02/20 18:24:41ID:FLHTnHy4
>>547
ぐぐってみましたがよくわかりません
モジュールですか?
0549nobodyさん05/02/20 18:26:01ID:???
ファイルハンドルをpackageやオブジェクトのメンバにする事は
できないのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています