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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/03/14(水) 22:54:12
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

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

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

http://www.perl.org/get.html
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3

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

リンク集は>>2-3
過去スレは>>4
0359デフォルトの名無しさん2007/04/25(水) 22:08:09
強くなれ!! と願いを込めて、子供たちに食べさせるとよいね。
0360デフォルトの名無しさん2007/04/25(水) 23:13:46
弱者の肉なんかいくら食べても強くなれないよ
0361デフォルトの名無しさん2007/04/25(水) 23:27:06
食べるのなら、戦場で最前線に立つモヒカンを食べよう。
0362デフォルトの名無しさん2007/04/26(木) 09:20:12
   / : 》:、∩
  (===○=)/  センセー
__ /  ⇔ /     話しについてけませーん
\⊂ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
 ...|| ̄ ̄ ̄ ̄||
0363デフォルトの名無しさん2007/04/26(木) 22:17:39
>>346
CGI言語と来たか・・・。

本当に作ってしまって混乱させるというのはどうか?
もちろんその言語はクライアントマシンの限られた
中でしか使えず、 Web の CGI になんて使えないのだ。
0364デフォルトの名無しさん2007/04/26(木) 22:18:42
Common Graphics Interface とかいう紛らわしいグラフィック操作用言語を新たに作る。
0365デフォルトの名無しさん2007/04/26(木) 23:07:10
parrot上で走らせたらもっと混乱の元に。
0366デフォルトの名無しさん2007/04/26(木) 23:15:11
コモン グラフィックス インタープリター

池袋で乗車してきた女の子がハロプロエッグの子とかたかまりこ
0367デフォルトの名無しさん2007/04/27(金) 11:39:27
ついでだ。IT言語というのも作ってしまえ。
0368デフォルトの名無しさん2007/04/27(金) 11:57:03
そろそろここは質問箱だということを思いだそう。
0369デフォルトの名無しさん2007/04/27(金) 15:28:36
そういえば Perl の質問がないなあ・・・。
0370デフォルトの名無しさん2007/04/27(金) 15:34:31
Chanto Gugure Internet de
0371デフォルトの名無しさん2007/04/27(金) 17:29:18
perlってグーグル八分されてるんだってね
0372デフォルトの名無しさん2007/04/27(金) 18:13:20
WindowsでDOSコマンドの結果を取り込むには、
どうすればよろしいでしょうか?例えば、
dir c:\trash
の結果を取り込もうとしても、次のスクリプトではうまくいきません。

$files = `dir c:\\trash`;
print "The files are $files\n";
0373デフォルトの名無しさん2007/04/27(金) 18:43:53
GW前に出された宿題で質問が増えるから大丈夫w
0374デフォルトの名無しさん2007/04/27(金) 18:53:55
>372
手元だとそれでうまくいってるけど。
03753722007/04/27(金) 20:04:12
>>374
すみません。書き忘れていました。>>10にある先頭の5行を入れていました。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";

「use open IO => ":encoding(cp932)"; 」の行を削除して
次のように修正すると動きました。
use Encode;
$orgfiles = `dir c:\\trash`;
$files = decode('cp932', $orgfiles);
print "The files are $files\n";
0376デフォルトの名無しさん2007/04/27(金) 21:23:44
>>372

例によって cmd.exe /c dir ... じゃない?
0377デフォルトの名無しさん2007/04/27(金) 21:24:53
失礼、関係なかったのね。
0378デフォルトの名無しさん2007/04/27(金) 21:35:08
>371
記号が多いから、とか?
0379デフォルトの名無しさん2007/04/27(金) 22:21:10
>>378
うんにゃ、LWPのUAがはじかれる件でしょ?
0380デフォルトの名無しさん2007/04/27(金) 22:23:19
>>378
Perlで書かれたボットの多くがLWPのデフォルトUser-Agentをそのまま名乗って
おり、403を食らうようになった。当然だがUAを変えれば通れる。
0381デフォルトの名無しさん2007/04/27(金) 22:24:27
Google八分ってのは、Googleの検索結果に出なくなる話だから、
今回のそれとは違うよな。
0382デフォルトの名無しさん2007/04/27(金) 22:30:29
新しく覚えた言葉を使ってみたかっただけだろ
そう責めるな
0383デフォルトの名無しさん2007/04/28(土) 00:19:39
perlのモジュールって一気にアップデートできないの?
それとも使う奴だけ手動でアップデートさせるしか方法ない?
0384デフォルトの名無しさん2007/04/28(土) 00:39:19
>383
cpanシェルでupgrade
03853782007/04/28(土) 01:18:47
Perlに限らないけど、プログラミング言語の仕様として存在する演算子や記号は検索しづらいよなあ。
0386デフォルトの名無しさん2007/04/28(土) 03:22:17
不満を抱えるものが改善する。それが基本である。
0387デフォルトの名無しさん2007/04/28(土) 05:09:49
でもそれを誰かが改善したらPythonっぽい何かになるからPythonでいいよねw
0388デフォルトの名無しさん2007/04/28(土) 17:56:47
比較演算子は記号じゃなくて文字列にすりぁいいんだよな
Pealのeqとかみたいにさ
0389デフォルトの名無しさん2007/04/28(土) 19:26:07
>>380
なったと言っても数年前からだよ。
今頃騒いでるやつらはアンテナが低すぎると思ったのだった。
0390デフォルトの名無しさん2007/04/29(日) 01:57:47
struct {
 char len1;
 char word1[len1];
 char len2;
 char word2[len1];
 char len3;
 char word3[len1];
}

みたいな構造の可変長のバイナリなデータがあるんですが、
これをperlで綺麗でかっこよく展開する方法ってないですか?

今は下のようなことをしてるのですが、なんか見辛いし汚いので…

$data = "\4ABCD\3EFG\7HIJKLMN";

($len1,$data) = unpack("Ca*",$data);
($word1,$data) = unpack("a${len1}a*",$data);
($len2,$data) = unpack("Ca*",$data);
($word2,$data) = unpack("a${len2}a*",$data);
($len3,$data) = unpack("Ca*",$data);
($word3,$data) = unpack("a${len3}a*",$data);

print "$word1\n$word2\n$word3\n";
0391デフォルトの名無しさん2007/04/29(日) 03:40:49
少なくともループ構造にするべきだと思う
0392デフォルトの名無しさん2007/04/29(日) 04:06:37
>>390
perldoc -f pack して目を皿のようにして熟読せい。

The "/" template character allows packing and unpacking
of strings where the packed structure contains a byte
count followed by the string itself. You write
*length-item*"/"*string-item*.

0393デフォルトの名無しさん2007/04/29(日) 05:12:56
>>392
あああああ、そんなテンプレートがあったんですね。
日本語の5.6ベースのman見てたので気づきませんでした…
ありがとうございます。
0394デフォルトの名無しさん2007/04/30(月) 02:59:39
>>393
あ、すまん。
5.6からの拡張だと思ってたが、違ったか(393には問題ないみたいでよかった)。
0395デフォルトの名無しさん2007/05/01(火) 17:38:05
ファイル内の文字列を置換するスクリプトを書いているところなのですが、
「置換する」「置換しない」(飛ばす)「残り全て置換」「キャンセル」という
処理を行うにあたって、見つけた文字列を置換せずに飛ばして次を置換する
方法が思いつきません。置換しないテキストは適当な文字列に置換しておいて
最後に戻すという方法も考えたのですが、あまりスマートではないと思いまし
た。何かよい方法があったら、お知恵をお貸しください。

while($text =~ /($regexp)/) {
if($all == 0) {
$before = $1;
$after = $1;
$after =~ s/$regexp/$replace/m;
print "置換前:\n$before\n置換後:\n$after\n";
do {
print "置換する? [y]es [n]o [a]残り全て [g]キャンセル ";
$key = <STDIN>;
chomp($key);
} while ($key ne "y" and $key ne "n" and $key ne "a" and $key ne "g");
if($key eq "y"){
$text =~ s/$regexp/$replace/m;
}elsif($key eq "n"){
# ここをどうする?
}elsif($key eq "a"){
$text =~ s/$regexp/$replace/gm;
$all = 1;
}else{ exit; }
}elsif($all == 1) {
$text =~ s/$regexp/$replace/gm;
}
}
03963952007/05/01(火) 17:39:43
補足です。$textはファイルの内容、$regexpは置換前の文字列、$replaceは
置換後の文字列です。
0397デフォルトの名無しさん2007/05/01(火) 17:51:02
>>395
ヒント: posと\G

perl -e '$x = "aaaaaa"; pos($x) = 2; $x =~ s/\Ga/x/; print $x,"\n";'
aaxaaa
03983952007/05/01(火) 21:09:08
ありがとうございます、無事できました。コードはこのようになりました。(たぶん問題ないはず…)
$p = 0;
while($text =~ /\G(?:.*\n)*?.*?($regexp)/gm) {
$p = pos($text) - length($1);
pos($text) = $p;
if($all == 0) {
$before = $1;
$after = $1;
$after =~ s/$regexp/$replace/m;
print "置換前:\n$before\n置換後:\n$after\n";
do {
print "置換する? [y]es [n]o [a]残り全て [g]キャンセル ";
$key = <STDIN>; chomp($key);
} while ($key ne "y" and $key ne "n" and $key ne "a" and $key ne "g");
if($key eq "y"){
$text =~ s/\G$regexp/$replace/m;
pos($text) = $p + length($after);
}elsif($key eq "n"){
pos($text) = $p + length($before);
}elsif($key eq "a"){
$text =~ s/\G$regexp/$replace/gm;
$all = 1;
}else{
exit;
}
}elsif($all == 1) {
$text =~ s/\G$regexp/$replace/gm;
}
}
0399デフォルトの名無しさん2007/05/01(火) 21:31:38
\Gの使い方がおかしいような
最後の全置換は絶対うまくいかんだろ
0400デフォルトの名無しさん2007/05/01(火) 22:01:18
せっかく書いたんだからたぶんとかいってないで動かしてみるべきだな。
04013952007/05/01(火) 22:02:38
すみません、やっぱ問題がありました。置換位置\Gが正規表現に含まれている
と、置換される文字列に改行が含まれている際に、オプション"g"をつけても
複数置換してくれなくなってしまうのですが、どうすればいいんでしょうか。

perl -e '$text = "a\na\na"; $text =~ s/\Ga/b/gm; print "$text\n";'
結果:
b
a
a

perl -e '$text = "aaa"; $text =~ s/\Ga/b/gm; print "$text\n";'
結果:
bbb

perl -e '$text = "a\na\na"; $text =~ s/a/b/gm; print "$text\n";'
結果:
b
b
b
0402デフォルトの名無しさん2007/05/01(火) 22:23:56
\Gは置換文では使わないほうがいいよ。代入されるとposがリセットされてしまうから
あとを置換しながらposを保持することはできないのでコピーを作ることを考えてみては
自分ならこう書く

my $replaced_text;
pos $text = 0;

while (pos $text < length $text) {
 if ($text =~ m/\G $regexp/gcsx) {
  # ここで入力による分岐処理を行う



 }
 elsif ($text =~ m/\G(.+?) (?=$regexp)/gcsx) {
  $replaced_text .= $1;
 }
 else {
  $text =~ m/\G (.*)/gcsx;
  $replaced_text .= $1;
 }
 



0403デフォルトの名無しさん2007/05/01(火) 22:28:17
s///gが一種のループなのでこんな手もある。
my $mode;
$text =~ s{($regexp)}{
my $r;
if (!defined $mode) {
my $key;
do {
print "置換する? [y]es [n]o [a]残り全て [g]キャンセル ";
$key = <STDIN>;
chomp($key);
} while ( $key ne "y"
and $key ne "n"
and $key ne "a"
and $key ne "g" );
if ($key eq 'y') {
$r = $replace;
} elsif ($key eq 'n') {
$r = $1;
} elsif ($key eq 'a') {
$mode = 'a';
} else {
$mode = 'g';
}
}
if ($mode eq 'a') {
$r = $replace;
} elsif ($mode eq 'g') {
$r = $1;
}
$r;
}gme;
04043952007/05/01(火) 23:34:11
>>402-403
おお、これはすごい、正規表現でループができるんですね。
>>403の方法できれいなスクリプトになりました。ありがとうございます。
0405デフォルトの名無しさん2007/05/02(水) 03:13:40
CPANシェルについてなんですが、
インストールするごとに[1]とか[2]とか増えるのはなんなんでしょうか?
0406デフォルトの名無しさん2007/05/02(水) 03:44:02
>>405
現在実行したコマンドを識別するIDみたいなもの。
何に使ってるかまでは見てないけど。
ちなみに↓とやるとIDを変えてしまうこともできる。特に意味はない。
cpan[1]> ! $CPAN::CurrentCommandId = 100;
0407デフォルトの名無しさん2007/05/02(水) 05:56:50
>>406
レスありがとうございます。
そうなんですか。

なんか Bundle::CPAN をインストールしてからそうなったような気がしたので、
間違えたかと思いました。
そのような情報ってどこで得ているのでしょうか?
0408デフォルトの名無しさん2007/05/02(水) 09:35:32
モジュール(lib/CPAN.pm)のコードを読む。
0409デフォルトの名無しさん2007/05/02(水) 14:03:43
>>406
知らないけど、ヒストリ用では?

よくUNIX用のシェルであるんだけど、 ! の直後にその番号入れて
実行するとその番号のコマンドが動くんだよ。全く同じなら再入力
する必要がないの。(更に後ろに :s/// のようなのを付けて文字列
置換できたりもする。 !30:s/aa/bb/ みたいな。全てのシェルが
同じこと出来るかどうかは知らないが)。
0410デフォルトの名無しさん2007/05/02(水) 21:18:49
cpanpのメリットがイマイチわからん
0411デフォルトの名無しさん2007/05/02(水) 21:20:37
最近CPAN.pmがだいぶ進化したからCPANPLUS.pmの意義が相対的に薄くなったしねー
0412デフォルトの名無しさん2007/05/03(木) 06:35:39
awkは多少かじったのですが、perlはまるっきりの初心者です。どなたかお知恵を貸して下さい。
2つのファイル a.txt と b.txt を比較して、条件にあった行を抽出、出力するスクリプトを作りたいのです。

具体的には、
[a.txt]
ID, field1, field2
1, 5.8, 7.3
2, 6.3, 8.2
3, 3.2, 4.1
4, 4.8, 4.0
5, 8.3, 10.2

[b.txt]
ID, field1, field2
1, 6.8, 7.7
3, 4.3, 5.5
4, 5.9, 4.9

というファイルがあったとき、b.txt のIDに数値が存在する行だけを a.txt から抽出して a2.txt として保存したいのです。

[a2.txt]
ID, field1, field2
1, 5.8, 7.3
3, 3.2, 4.1
4, 4.8, 4.0

と言った具合にです。よろしくお願いします。
0413デフォルトの名無しさん2007/05/03(木) 07:47:00
#!/usr/bin/perl
use strict;
use warnings;
open my $a, '<', 'a.txt' or die;
open my $b, '<', 'b.txt' or die;
my %ids = map { $_ => 1 } map { (split /,/)[0] } <$b>;
while (<$a>) {
    my $id = (split /,/)[0];
    print if $ids{$id};
}
04144122007/05/03(木) 08:00:05
>>413さま
 早速のレス、ありがとうございます。助かりました。
 こんなに簡単にできちゃうんですね。しかし、私にはスクリプトの内容は不明...。解読して勉強させていただきます。
0415デフォルトの名無しさん2007/05/03(木) 13:36:22
use IO::File;

sub func {
my $file = shift(@_);
my $input = IO::File->new($file,"r") or die;
ごにょごにょ
  ・
  ・
}

$filename = (ディレクトリからファイルネームをとるロジック);
&func($filename);

みたいに書くと、一番最初にいきなりファイルオープンのエラーが出ます。
その後、ファイルネームをとるロジックが走ってる模様…。
何故か解らないのですが原因解りますでしょうか。
0416デフォルトの名無しさん2007/05/03(木) 13:48:01
>>415
原因はわかりますよ。
あんたが、そう動くようにプログラムを作ったから。
04174152007/05/03(木) 13:53:53
>>416
早い回答ありがとうございます。
やっぱり自分が悪いんですね。
調べてみます。
04184152007/05/03(木) 14:26:25
うーんやっぱり解らない…。
サブルーチンが先に実行される事なんてあるのか…?
0419デフォルトの名無しさん2007/05/03(木) 14:50:10
>>415
まあエラーメッセージでも貼ってみ
04204152007/05/03(木) 15:05:12
>>419
そのようなファイルやディレクトリはありません at (何行目)
としか出ないんですが…。
0421デフォルトの名無しさん2007/05/03(木) 15:08:03
>>420
訳したりせずにそのまま貼れ
04224152007/05/03(木) 15:16:54
そのようなファイルやディレクトリはありません at test.pl line 32.

だけです。
CentOS4.4、perl5.8.5です。
04234152007/05/03(木) 15:30:01
フルパス指定してなかった…。

>>422さん、親身になってくれてありがとうございます。
くだらないミスで申し訳ありません。
本当にすみませんでした。
0424デフォルトの名無しさん2007/05/03(木) 15:40:40
>>423
s/422/421/g;
0425デフォルトの名無しさん2007/05/03(木) 15:47:38
突っ込みどころはいろいろあるけど、エラーメッセージは自分のためにも他人のためにもわかりやすくすべし。

my $fp_in = IO::File->new($filename, "<") or die qq(cannot open '$filename': $!);
04264152007/05/03(木) 16:07:57
>>425
了解です。ただ or die $!;だけしてました。
連休中にコメントありがとうございました。
0427デフォルトの名無しさん2007/05/05(土) 14:17:50
chompって何の略ですか?
0428デフォルトの名無しさん2007/05/05(土) 14:26:54
>>427
略じゃないよ。
噛み切るとかそんな感じ。
0429デフォルトの名無しさん2007/05/05(土) 14:41:24
chomp 【自動】 〜をムシャムシャ食う◆【同】champ
0430デフォルトの名無しさん2007/05/05(土) 14:43:41
へー。ありがとうございました。
0431デフォルトの名無しさん2007/05/05(土) 15:30:31
オブジェクト指向で書いていないので、巨大モジュールの分割がうまいこといかんのです><
具体的には、親パッケージが子パッケージをuseしているとき、
子パッケージから親パッケージのサブルーチンを呼べません。

Giko.pm
[-------
 package Giko;
 use Giko::Mona;
 (omaemonaサブルーチンをEXPORTしている)
 sub omaemona { .... }
-------]

Giko/Mona.pm
[-------
package Giko::Mona;
-------]

となっていた場合、
Giko::Monaの中でomaemonaを呼ぶ方法は、Giko::omaemonaしかないでしょうか?
Giko::Monaでuse Gikoはできないし、use base 'Giko';は違うみたいですし。
0432デフォルトの名無しさん2007/05/05(土) 17:12:46
Encodeモジュールのfrom_toを用いて
「�@」「�A」や「�T」「�U」などを
sjis <-> euc-jp 変換すると文字化けしてしまいます。

回避するにはどうすればいいでしょうか?
0433デフォルトの名無しさん2007/05/05(土) 19:33:33
>>432
つEncode::EUCJPMSのcp51932
0434デフォルトの名無しさん2007/05/05(土) 20:32:56
それは拡張文字なので、 sjis じゃなく cp932 を指定。
0435デフォルトの名無しさん2007/05/05(土) 20:40:22
単純に分割するなら、全部同じ名前空間に展開すればいいんじゃない

Giko/Mona.pm
[-------
package Giko::Mona;
package Giko;
-------]
04364312007/05/06(日) 01:14:39
遅レスで申し訳ないです。
>>435
なるほど。
まとめると巨大ファイルになりがちで不安だったのですが、
今のところはまだなんとか1ファイルにまとめられそうなので、
同じファイルスコープで仲良く共存してみます。
ありがとうございました。
0437デフォルトの名無しさん2007/05/06(日) 17:12:14
例
    ( split /\//, $x )[0 .. bar];

リストの末尾要素を除いたリストを返す方法、知りませんか?
barをどう記述すりゃいいのやら。

Perl ならできそうな気がするんですが。思い当たりません。
検索してみたものの、それらしいものも見つけられません。
0438デフォルトの名無しさん2007/05/06(日) 17:31:22
( @hoge, undef ) = split //, $foo ;
じゃダメなの?
0439デフォルトの名無しさん2007/05/06(日) 17:43:01
>>437
尻尾だけ消すのじゃだめなの?
0440デフォルトの名無しさん2007/05/06(日) 17:44:40
最後から2番目の要素をひとつ抜き出すだけなら (〜)[-1]
でいいんだけど、範囲演算子で(〜)[0..-1]とは書けないんだよな。

配列変数なら@x[0..$#x-1]という書き方もあるが、リストでは$#xに
相当するものが書けない。

とりあえずおもいついたのはこれ。

sub{@_[0..$#_-1]}->(〜)
0441デフォルトの名無しさん2007/05/06(日) 18:03:14
>>437
@list = split(/\/(?=.+\/)|\/.+$/, $x)

とかやってないで、全部入れてから$#list--すればいいんじゃね?
0442デフォルトの名無しさん2007/05/06(日) 18:31:19
>>429
首チョンパの略と思ってた
0443デフォルトの名無しさん2007/05/06(日) 18:38:52
まずchopありき。
やがてより安全なchomp生まれり。
0444デフォルトの名無しさん2007/05/06(日) 18:52:28
え…普通にpop関数じゃだめなの
0445デフォルトの名無しさん2007/05/06(日) 19:51:31
popの第1引数は左辺値つーかARRAYじゃないと×じゃ?
0446デフォルトの名無しさん2007/05/06(日) 20:19:01
splice @{[split /\//, $x]}, 0, -1 というのはどうだ
0447デフォルトの名無しさん2007/05/06(日) 20:35:56
ちょんぱ
0448デフォルトの名無しさん2007/05/06(日) 21:07:48
# 悪い例
(split /\//, $x)[0..(split /\//, $x)-2]
0449デフォルトの名無しさん2007/05/06(日) 21:21:14
>>448
scalar contextのsplitは@_を上書きしちゃうからねぇ。
0450デフォルトの名無しさん2007/05/06(日) 22:19:22
(split m{/})[0..(s{/}{/}g)-1]
0451デフォルトの名無しさん2007/05/07(月) 00:17:23
みんなよく頑張ったな。先生感心したぞ。

my $str = 'foo/bar/baz/quux';
sub p { printf ">>%d:[%s]\n", shift, join ',', @_ }

p(438, (my @arr, undef) = split m{/}, $str);
p(439, do { @arr = split m{/}, $str; pop @arr; join ',', @arr }); # & >>444-445
p(440, sub { @_[ 0 .. $#_ - 1 ] }->(split m{/}, $str));
p(441, split m{/(?=.+/)|/.+$}, $str);
p(446, splice @{[ split m{/}, $str ]}, 0, -1);
p(448, (split m{/}, $str)[ 0 .. (split m{/}, $str) - 2 ]);
p(450, (split m{/}, $str)[ 0 .. $str =~ tr|/|/| - 1 ]);
p(451, $str =~ m{(.+?)/}g);
0452デフォルトの名無しさん2007/05/07(月) 00:52:33
>>451
my $str = 'foo/bar/baz/quux';
を
my $str = '/foo/bar/baz/quux/';

にすると、いろいろ違いが出てくるね。
0453デフォルトの名無しさん2007/05/07(月) 00:58:21
>>451
重箱の隅つつき。

p(451 の行の正規表現。(.+?) ではなく(.*?) でなければ
split を用いた他の例と挙動が違うぞ。
$str = q{/foo/bar/baz/quux} で確かめろ。
04544372007/05/07(月) 01:10:11
多くのお返事ありがとうございました。

>440
単純な範囲演算子で記述できそうに思った私が考え足らずだったようです。
sub { @_[0 .. $#_ - 1] }->(split /\//, $x) は見た目にわかり易いですね。
いろいろ応用できそうだし。しかし、私は露とも思い至りませんでした。

>441
まぁ、そうなんですよね。

$file = "/usr/local/bin/bar"; # ファイル名が与えられて。。。
$fold = join "/", 〜split /\//, $file を使った記述〜; # フォルダ名を得る。

ここで余分に変数を使わず、可読性も損なわない方法がありそな気がしたもので。

>446
splice の第一引数はARRAYしかダメだと諦めてしまったのです。
リファレンスについて熟知すると、こんなやり方に気付くんですね。

自分の頭の硬さとリファレンスに対する理解の浅さを恥じて
精進したいと思います。
まず、>440 さんと >446 さんの方法、どっちを使うか悩みます。
0455デフォルトの名無しさん2007/05/07(月) 01:17:53
>>454
いいからFile::Specを使え。
0456デフォルトの名無しさん2007/05/07(月) 01:19:48
>>454
いや、可読性が低下するから、いったん配列に入れてからスライスした方がいいと思うぞ
上のは遊びなんだから
0457デフォルトの名無しさん2007/05/07(月) 02:28:37
こういうよくありそうな処理が案外スラっとかけないもんなんだね。
Dだと [0 .. $ - 1] でいけるんだが。
0458デフォルトの名無しさん2007/05/07(月) 05:57:16
>>456
しかし落ち着いて俯瞰すればこういう雑用の可読性を気にする時点でそのソース全体が残飯ですね。
0459デフォルトの名無しさん2007/05/07(月) 08:33:53
超初心者でふが良いですか?

標準のキーボードから入力を受け取ってどうやれば入力を反映させれるかわからないです・・・

#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
while(<>){
if($_=m/3/){print"これはこねこ"};
};

↑これでは3を入力するたびに、これはこねこって出てくるんですが、

#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
while(<>){
if($_=m/3/){print"これはこねこ";$kyara=3}
elsif($_=m/2/){print"これはゴーレム";$kyara=2};
};

これのelsif文が実行されないぽいんですがなんででふか?

頭硬くてすみません・・・
■ このスレッドは過去ログ倉庫に格納されています