【モダン推奨】Perlについての質問箱 50箱目

■ このスレッドは過去ログ倉庫に格納されています
2012/01/21(土) 10:56:39.03
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )

回答する際はモダンな方法でお願いします
(例 jcode.plではなくEncodeモジュールを使った方法)
理由はもう2012年です。いい加減2000年以前の方法はやめましょう。
最新のPerlを使うほうがかっこいいです。
いつまで勉強しないつもりですか?
過去にとらわれるのはもうやめです。進歩しませんよ。

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

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

http://www.perl.org/get.html
● 2011/10/30 現在の最新版: 5.14.2

▼ 前スレ
Perlについての質問箱 49箱目
http://toro.2ch.net/test/read.cgi/tech/1319953460/
リンク集は >>2-3辺り
Perl 日本語処理の基礎の基礎 >>4辺り


2018/08/12(日) 05:27:13.10ID:YGBUsYMx
rsyncは、Windowsでもつかえるぞ。
699デフォルトの名無しさん
垢版 |
2018/08/12(日) 05:29:09.82ID:5MmmYY5A
Windows でバックアップというと xcopy や robocopy だろうな。
rsync も動くんじゃないか? Cygwin や WSL 上の Ubuntu とかなら確実に動くと思うが。
2018/08/12(日) 06:37:38.09ID:I0JtNgg1
rsyncっていうかrdiffかな

rdiffの出力形式がどんなのか知らないけど、
リストア時にもrdiffが必要だというなら避けたい

ただのzipなりtarなりのアーカイブを順に上書き展開するだけでいい状態にしておかないと、
リストアが必要な事態になった時には多分リストア用のツールも無い
701615
垢版 |
2018/08/12(日) 14:53:20.30ID:em9BUun6
>>697
robocopy
2018/08/12(日) 15:08:29.76ID:I0JtNgg1
だからミラーを作りたい訳じゃないって

ミラーも実はあるけど
そっちはもっと頻度の高いバックアップ用で、
物理的に別のドライブなら同時に壊れる確率は低いだろうという考え

そうじゃなくて、PC一式盗まれた/津波で流された/証拠物件として押収された、等の為に、
まるきり新規から昨日の作業環境を復元したい時の為に、
最低限の情報をクラウドに置いてある

それは特定のディレクトリ以下まるごとのアーカイブでいいんだけど、
サイズが巨大になるので2代目以降は差分で済ませたいというのがそもそもの動機
703615
垢版 |
2018/08/12(日) 16:11:04.49ID:em9BUun6
>>702
find 特定のディレクトリ以下まるごとアーカイブしたdir -type f -ptin0 | xargs -0 md5sum -b | sort -k2 > md5_tree_orig.out

で生成した md5_tree_orig.out を保持しておき、

md5sum --quiet -c その後更新を受けた上記dir md5_tree_orig.out

で追加/削除/更新されたファイルを検出しリストアップ
とか
2018/08/12(日) 16:17:29.70ID:I0JtNgg1
まあ、そんなようなことをタイムスタンプの比較だけでやらせた

リストアップまでは簡単で、差分のアーカイブの作成と、
ファイルが減ってたらリストア側からも減らす仕組みが面倒なんだけど
動かしてみると空のディレクトリが生成されてなかったり
2018/08/12(日) 18:42:09.50ID:YGBUsYMx
信頼性の不安とか動作確認のめんどさとか考えたら、rsync/robocopyにしたほうがいいんじゃないの?
どうしても差分だったらrdiff-backupとか?
2018/08/12(日) 19:21:31.28ID:I0JtNgg1
ミラーは既にやってるからもう要らない
差分のアーカイブを作ってネットに保存するというのをやりたいだけ

勧めるとしたらtarのバックアップ機能で、まさに差分だけのアーカイブを
作る機能があるんだけど、windowsに移植した人が更新時間とアクセス時間とか
あのへんを失敗してるみたいで、試したのは使えないビルドだった
707615
垢版 |
2018/08/12(日) 21:24:20.34ID:YC+nt/a3
mtimeに基づいて更新されたファイルだと判定する方法は、
アーカイブから抽出した古い日付のファイルを見落とすので
抜けが起きる可能性があるよ
2018/08/12(日) 21:35:27.48ID:Q5PU7gst
よし、cygwinを導入してcygwinのtar使おうぜ。
2018/08/12(日) 21:37:14.43ID:I0JtNgg1
makeじゃないんだから
イコールでなければ当然更新対象

でもなー
意図的にタイムスタンプを保持したまま修正する、みたいなことを
あちこちでやってるんだよな
2018/08/12(日) 21:43:05.49ID:TfFR22LF
tar.exe はWindows10だと標準で入るらしい。

「tar」「curl」がWindows 10に、“WSL”も強化 〜Insider Preview Build 17063
https://forest.watch.impress.co.jp/docs/news/1097996.html
2017年12月20日 15:17
2018/08/12(日) 21:58:15.81ID:I0JtNgg1
新しき皮袋に古き酒を
2018/08/12(日) 22:20:57.53ID:6ZKYHExR
λ where curl
C:\Windows\System32\curl.exe

λ where tar
C:\Windows\System32\tar.exe

ホンマや
2018/08/21(火) 07:25:20.85ID:dabiAoHj
AnyData は固定長レコードに対応してなかったんだな…
2018/08/21(火) 07:26:35.45ID:Y1HyydAv
>>710
色々始まってきてんね
715デフォルトの名無しさん
垢版 |
2018/08/22(水) 02:53:12.04ID:wb9Zg9xS
        _ ―- ‐- 、
       (r/ -─二:.:.:ヽ   始まったな
       7''´ ̄ヽ-─<:.:.',                  __
.      〈t<  く=r‐、\:く       _ ...-::‐::¬::::: ̄:::::::::::::::::::::::::::::::
      ∠j ` / ,j={_/ヽヽr'       >:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
       っ Y _/ ヽ了       /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.       し イ --─¬       /::::::/:/|:::/::∧:::∧:::::::::::::::::::::::::::::::::::
         f: :_: : :_:_:_└ 、     |/f|/|/ .|/ |/ ∨ ヽ|\:::::::::::::::::::::::::
        /-ー/: : : : : : :\      {            ヘ:::::::::::::::::::::
       /7: : : :r: : : : : : : : : }     ',  .j /     }   .}::::::::::::::::::::
      /: : : : : :.|: :j: : : :\: : j      } /_       ミ   ヘ::::::::::::::::::
     /: : : : : : : j: ヘ、: : : : \|    /く<l´::<ニ二 ̄`>   ミ:::::::::/
    ./: : : : : : : \::::ヘ: : : : : : :ヽ    {::ア{:::::::}厂¨,`_______j:::::://
    {: : : : : : : : : : ヘ:::ヘ: : : : : : :',    V ヘ::::ノ` ̄  ̄ ̄ ̄ ̄ .{::::|ヽ
    ',: : : : : : : : : : : :\ヘ: : : : : :ヘ.   /  ヘ¨       //:}::::|/
     ',: : : : : : : :::::::::::::::::::〉: :_:_.r--―く   >ヽ      /   _ノ::::{ _/
     '; : : : :.::::::::::::::::::::::r</ :.:..   `ー¬\__        /::::/
     〈: : : : :ー---‐‐r―'´  :.:.:.  ヘ: .  ヽ . . }ー、    ./::::<
                ああ・・・       ',: . .|: : 〉  /:::::::/
716デフォルトの名無しさん
垢版 |
2018/09/05(水) 22:22:13.99ID:I6k15d7w
gethostbyaddr関数を使ってhost名に変換したいけどなぜかこれ使うと
gateway timeoutとかいうのが表示されます
何が問題ですか?
717デフォルトの名無しさん
垢版 |
2018/09/06(木) 02:07:27.72ID:f49/P0Og
>>716
use Socket で getnameinfo 使っても同じ?
2018/09/16(日) 16:31:42.80ID:MQAfX2Z/
forkを使わずにperlからperlを複数起動するにはどうしたらいいだろう
2018/09/16(日) 21:13:46.95ID:7ofkNwvC
試してないけど
`perl hoge.pm &`
じゃダメ?
2018/09/16(日) 21:22:37.13ID:MQAfX2Z/
一つだけ起動ならそれでいいだろうけど、複数起動できない
2018/09/16(日) 23:05:41.48ID:UmczuJY3
forkがダメな理由は?
2018/09/16(日) 23:26:35.23ID:MQAfX2Z/
タスクをkillする別のスクリプトと組み合わせて使う予定で、
windowsのperlのforkはkillと相性が悪いから
2018/09/17(月) 01:48:55.49ID:N6BlbWjP
Win32APIを直接使えば。
CreateProcess()とか。
724デフォルトの名無しさん
垢版 |
2018/09/17(月) 02:58:47.55ID:voWgbO/q
>>720
my $pid1 = system(1, "perl prog1.pl");
my $pid2 = system(2, "perl prog2.pl");

のようにして起動して後でこの $pid1, $pid2 に対して kill するのは?
2018/09/17(月) 03:00:07.85ID:voWgbO/q
ごめん。2行目間違えた。こうね。system() の第一引数はどちらも1。

my $pid2 = system(1, "perl prog2.pl");
2018/09/17(月) 07:03:10.02ID:Ilv6SnQZ
おお、何故かうまく行く
理由が判らない
727デフォルトの名無しさん
垢版 |
2018/09/17(月) 12:38:21.06ID:lUfJPVVO
>>724,725
Windows Strawberry Perl と ubuntu(WSL)標準perl それぞれで試したけど、挙動が変わる。
以下のようにthreadsを使ったらどうかな。挙動も同じになるし。

use threads
my $t1 = threads->create(sub { system("perl prog1.pl"); });
my $t2 = threads->create(sub { system("perl prog2.pl"); });
$t1->join();
$t2->join();
728デフォルトの名無しさん
垢版 |
2018/09/17(月) 20:28:41.27ID:voWgbO/q
あれ?規制されたか?
ちょっと書き込みテスト。
729デフォルトの名無しさん
垢版 |
2018/09/17(月) 20:29:55.17ID:voWgbO/q
あれ?書けたな。
じゃあ書き込み内容か。じゃちょっとNGワード探るスレに行って来よう。
730デフォルトの名無しさん
垢版 |
2018/09/17(月) 20:36:45.38ID:voWgbO/q
規制理由がわかった。「cmd.exe」が半角で入っている書き込みはダメなようだ。
ということで元の書き込みの該当部分を全角に置換した状態でコピーする。

Windows だと cmd.exe 経由で動かしてるようだな。system(1, '...') で返してくるPIDがcmd.exeのPIDだ。
perl.exe は cmd.exe が動かすので PID が違っている。

じゃあ与える引数をリストにしたらどうなのかと思って Windows でやってみたら cmd.exe 経由では
なくなって perl.exe のPIDが返ってきたよ。こんな感じ。

my $pid1 = system(1, 'perl', 'prog1.pl');
my $pid2 = system(2, 'perl', 'prog2.pl');

これだと多分OS違っても大丈夫なんじゃないかな?
2018/09/17(月) 20:38:07.48ID:voWgbO/q
ごめん。また2行目が2になってた。やるなら1変えてやって。
2018/09/17(月) 22:03:10.33ID:N6BlbWjP
systemの戻り値はプロセスIDではないはずだが。。。
733デフォルトの名無しさん
垢版 |
2018/09/17(月) 23:33:01.82ID:voWgbO/q
>>732
perldoc perlport で見るとこれはもしかすると Win32 だけかも知れない。
「(Win32)」ってくっついてるので。
2018/09/19(水) 08:37:16.87ID:wlIidQxJ
Windowsの「プログラムと検索」で「cmd.exe /C del c:\*.*」
を検索すると何がヒットする?

…と聞かれて、やってしまう人を保護しているのかな?
735デフォルトの名無しさん
垢版 |
2018/09/19(水) 13:40:02.89ID:gcT5tzZy
>>734
del に /S 忘れてるぞ。
2018/09/20(木) 23:11:28.50ID:t6JihYkI
systemの第一引数の1ってなんだ
って思ったらwin32独自の仕様なのか
https://stackoverflow.com/questions/11532500/perl-system1-commands#comments-11532774
2018/09/21(金) 00:00:27.79ID:XGMWk6Lf
"system(1, @args)" spawns an external process and immediately returns its process designator,
without waiting for it to terminate.

まさにそういうのが用意されてるんだな
知らんがな
2018/09/21(金) 01:30:00.65ID:JP8I8TZy
>>737
> spawns
dos 時代は spawn と fork は使い分けられていたのですけど、最近はそうではないようですね…
739デフォルトの名無しさん
垢版 |
2018/09/21(金) 03:06:25.03ID:m7KC0L1Z
ちんぴょろすぽーん
2018/09/21(金) 09:00:53.42ID:m8DL5ZJ4
>>730
Ruby のsystem 関数では、引数の個数が1つで、
記号など、シェルのメタ文字を含む場合は、シェル経由で実行される

それ以外は、Rubyインタープリタから、直接実行される
741デフォルトの名無しさん
垢版 |
2018/09/21(金) 09:28:40.03ID:7bTZc31z
>>740
それ Perl と同じ。

system(1, ...) 形式は Win32 用。
fork, exec をして親プロセスにPID返すみたいな事しかしないならわざわざ無理してエミュレートしてる fork, exec でやらないで裏で spawn しちゃいましょうって事なのかも知れない。
2018/10/17(水) 22:55:37.70ID:dAVmpFbq
open $in, '-|', $file;
に対して、cp932をdecodeして扱いたい時はどう書くの?
2018/10/18(木) 00:25:47.59ID:/P5hGycw
Ruby では、rt は読み込みテキスト、
外部エンコーディングはsjis、内部エンコーディングはutf-8

s = ""

f = File.open("sjis.txt", mode = "rt:sjis:utf-8"){ |f|
s = f.read # 全て読み込む
}

puts s
744デフォルトの名無しさん
垢版 |
2018/10/18(木) 03:30:55.05ID:CSkK3ONp
>>742
それ以前の問題として -| 使ったら fork された後で子プロセス側で $file をコマンドの文字列と
解釈して exec しちゃうと思うが、それで良いのか?

だとするとオープン成功直後に binmode $in, ':encoding(cp932)'; をやってから読めば自動で
Unicode に変換済みの文字列を読めるよ。
2018/10/18(木) 05:44:50.16ID:w42KpNlE
'-|:encoding(cp932)'
みたいな書き方もできそうに見えるけど出来ないんだな
746デフォルトの名無しさん
垢版 |
2018/11/08(木) 02:01:28.04ID:PVk/9YBB
Haskellのモナドのdo記法っぽい書き方出来ないかと思ったけど…ジェネレータもないなら例外を経由しつつ隠蔽するしかないのかな
命名とかモナド則とか全然考えてないけど

sub run_maybe(&) {
  my ($block) = @_;
  my $value = eval { $block->() };
  if (my $e = $@) {
    # 例外がNothingなら戻り値に、それ以外は再スロー
    return $e if is_nothing($e);
    die $e;
  }
  return just($value);
}

sub bind {
  my ($maybe) = @_;
  # Nothingならそれを例外として投げ、そうでないなら中身の値をリターン
  ...;
}

my $maybe_int = run_maybe {
  my $x = bind foo();
  my $y = bind bar();
  return $x + $y;
};
747デフォルトの名無しさん
垢版 |
2018/12/10(月) 21:15:33.75ID:iIDHqnJC
$data1 = "100歳";
$data2 = "10000ドル";
これらを値と単位に分けるのはどうすればいいのですか?
2018/12/10(月) 21:24:33.74ID:onmtWwUs
$data =~ /(\d+)(.+)/;
$num = $1;
$unit = $2;
749デフォルトの名無しさん
垢版 |
2018/12/10(月) 21:34:11.14ID:iIDHqnJC
ありがとう^^
2018/12/11(火) 06:03:32.47ID:LK/HNouD
my ($num, $unit) = $data =~ /(\d+)(.+)/;
でもいける
751デフォルトの名無しさん
垢版 |
2018/12/11(火) 11:33:05.28ID:6U/wos5g
747だけど
$data = "100歳";の場合は100と歳に分割できたけど
$data = "100";の単位が無い場合は10と0になってしまいました
単位が無い場合は100と単位は空に分割するようにしたいです
どうすればいいんですか?
2018/12/11(火) 11:50:24.37ID:T1QyjEc7
/(\d+)(.*)/
2018/12/11(火) 19:54:59.78ID:yDndbNaF
"歳"のように単位だけの場合がうまくいきません
2018/12/11(火) 22:35:17.55ID:MmvOq85J
んなもん、エラーにしろよ。
2018/12/12(水) 02:54:18.27ID:+vNNSkfF
少しは自分のアタマで考えろ
2018/12/12(水) 08:52:36.90ID:mSgTllU8
そうだよな。
>>752
のどこか一文字変えればいいんだけど、
さて、どこをどう変えようか?
2018/12/12(水) 18:44:04.24ID:8oZHllaC
前方向にgreedyとかでけんかな
758615
垢版 |
2018/12/15(土) 16:39:19.35ID:iCCNyy8F


for (qw{100歳 10000ドル 100 歳}) {
my ($d, $o) = /((?:\d*+)?)((?:[^\d]*)?)/;
print "$d : $o\n";
}

$ perl 758.pl
100 : 歳
10000 : ドル
100 :
: 歳
759615
垢版 |
2018/12/15(土) 16:43:35.77ID:iCCNyy8F
>>758
いやこれで十分だった

for (qw{100歳 10000ドル 100 歳}) {
my ($d, $o) = /(\d*+)([^\d]*)/;
print "$d : $o\n";
}

$ perl 759.pl
100 : 歳
10000 : ドル
100 :
: 歳
2018/12/15(土) 16:59:48.28ID:2DpZ6qLn
いや、一文字変えればいいんだってば…
761615
垢版 |
2018/12/15(土) 17:04:09.15ID:iCCNyy8F
>>746
iteratorのgeneratorはclosureを使えば記述できるので、

sub xrange {my ($i, $n) = @_;
sub {$i <= $n ? $i++ : ()}};
$xrange1_10 = xrange(1, 10);

while (local $_ = &$xrange1_10) { # perlの場合generatorを呼び出すforeachはNG
print "$_\n";
}

$ perl 800gen_itr.pl
1
2
3
4
5
6
7
8
9
10

こういうclosureによるgeneratorを使ってその
「Haskellのモナドのdo記法っぽい書き方」はできる??
762615
垢版 |
2018/12/15(土) 17:07:47.65ID:iCCNyy8F
>>760
そだねー
2018/12/16(日) 09:55:03.75ID:sRmrp7hv
まだ Perl4 を使っている人たちがいるようだ。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11199717671
2018/12/16(日) 10:02:20.90ID:wu7F1Zb/
pythonの2と3が未だに入り乱れていて両方入れとくしかない状態が続いてる
パスが通ってるのは2で、3はパス込みで起動
2018/12/16(日) 12:03:41.52ID:/7qVlMZU
>>763
デリファレンス…じゃなさそうだな
2018/12/16(日) 12:34:40.06ID:wu7F1Zb/
perlの変数名($無しの部分)ってリファレンスなんだよな

$name がリファレンスの時、@$name でデリファレンスされることと、
@name と書くことは同じ意味になる

$#name と書きたい時にも敷衍できて、nameの代わりに{$name}と書いて、
$#{$name} と書くと思った通りの意味になる
2018/12/16(日) 13:33:32.09ID:sRmrp7hv
「Perl4 を使っている」というのは言い過ぎだったかな。
eval を使えばシンボリックリンクを実現できるけど
${$key} という表記はできなかったからね。
このカテゴリマスターの方々は単に Perl を知らないんだろう。
知らないのはいいが、なぜ回答するのか。
2018/12/16(日) 13:44:41.15ID:sRmrp7hv
書き間違えた。
s/シンボリックリンク/シンボリックリファレンス/
2018/12/16(日) 13:50:00.67ID:yJnPGyqy
>>763
Perl5でもおなじなんやで?
2018/12/16(日) 20:13:44.90ID:sRmrp7hv
え…何が? 表記のことなら Perl4 ではできなかった Perl5 の表記なんだけど。
2018/12/17(月) 00:09:00.22ID:iB9eUrL3
あ、デリファレンス記述を知らんヤツ発見、て意味だった?
勘違いした。w
2018/12/17(月) 07:49:28.02ID:WGHllUkv
>>766
> $name がリファレンスの時、@$name でデリファレンスされることと、
> @name と書くことは同じ意味になる

ん? $name と @name は別物じゃね?
@s = qw/a b c/;
$x = \@s;
print join ",", @x; # ""
print join ",", @$x; # "a,b,c"
2018/12/17(月) 09:07:21.92ID:GlvD8kJn
よくわからんけど気になるのだけど
結局リファレンスをデリファレンスして値つっこんでるだけ、でいいんだよね?
回答者が勘違いしてる変数名の変数指定ってどうやるんだっけか
2018/12/17(月) 12:40:59.21ID:JqNM8yOl
>>773
http://perldoc.jp/docs/perl/perlref.pod#Symbolic32references
2018/12/17(月) 12:59:58.19ID:GlvD8kJn
>>774
ありがとう
リファレンスで間接的?に定義された場合のみ暗黙的にアクセス可能になるのか
変な挙動だなぁ

昨日一応手元でワンライナー書いてから質問したんだけど
変数名を別に定義済みの場合は暗黙的解釈は成されないんだね
変だー
776770
垢版 |
2018/12/17(月) 17:36:00.20ID:fClvoBXn
>>771
ごめん。
「そこはまず、ハードリファレンスでしょ。Perl4 の時代に生きてるの?」
という意味です。自分でも不適切な表現だったと思う。
一応彼らの名誉のために言っとくが、回答に明確な間違いは無いと思う。
でも「${$key} の $key は何?」と聞かれて「変数名」と答えるのは
現代の Perl にそぐわないと思うの。
でももしかしたら、説明しても理解してもらえなさそうと思ったのだろうか。
2018/12/17(月) 19:18:45.78ID:iB9eUrL3
質問者がなんにも知らなそうだから、「リファレンス」をあえて避けたんやろ。
2018/12/17(月) 19:20:00.23ID:da/cFEJ/
>>772
name をリファレンスだと思う
(思うだけ。そんな文法ではない)

そうすると、そのリファレンスを$でデリファレンスしたものが$name
@でデリファレンスしたものが@name

$nameがリファレンスの場合に$でデリファレンスすると$$name なのは当たり前として、
$$$, $$$$ とどんどんデリファレンスしていける逆方向を辿ると、
$name もデリファレンスしたものだと見える
2018/12/18(火) 09:06:48.26ID:eR20sfLy
>>778
うーん
言いたいことはわからんでもないけど
Perlはそもそもスカラと配列とハッシュで名前空間が独立だからな…
780デフォルトの名無しさん
垢版 |
2018/12/27(木) 15:34:57.10ID:6u25HEJq
入力文字に$記号を含むパターンマッチについての質問

<input type="text" name="word">という入力フォームで$を入力して送信する
$form_data{'word'}はそれを受け取ったデータでこの場合$記号が格納されているとする

my $data = "aaa$bbb";

if($data =~ /$form_data{'word'}/){

print "ドル記号が含まれている";

}

とするとドル記号が含まれていると表示されるけど
$data="aaabbb";としてもドル記号が含まれていると表示されてしまいます
どうしたらうまくパターンマッチできるんですか?
781デフォルトの名無しさん
垢版 |
2018/12/27(木) 16:48:29.52ID:rm0epPGS
quotemeta 使えば?
2018/12/27(木) 17:39:49.72ID:xdSwIlO3
モダンPerl入門 増補改訂版(仮)
https://codezine.jp/book/modernperl2

まだ?
2018/12/27(木) 17:47:23.74ID:wqcRhsb/
> my $data = "aaa$bbb";
変数($bbb)が展開されてしまってるのでは?
2018/12/27(木) 17:55:58.93ID:aB5zW/KI
>>780
\$
2018/12/28(金) 05:51:18.79ID:zGkqlDaV
if ($data =~ /\Q$form_data{'word'}\E/) {
print "ドル記号が含まれている";
}
2018/12/28(金) 18:58:04.24ID:Kla9dPfb
ドルを含むかなら$data =~ /\$/ か$form_data{'word'} =~ /\$/ならわかるけど、
なぜ$dataと$form_data{'word'}をパターンマッチさせているのかがわからない。
2018/12/28(金) 19:19:12.35ID:PEXz027h
入力文字列を正規表現ではなくただの文字列として扱うならこっちの方が速い
if (index($data, $form_data{'word'}) >= 0) {
788デフォルトの名無しさん
垢版 |
2018/12/29(土) 10:19:08.15ID:UbMSpY+5
どのように書いたら配列の1,2,3を、それぞれ表示できるでしょうか?お願いします
sub test{
return \(1,2,3);
}
print test(); # SCALAR(0x169bc48)SCALAR(0x169bca8)SCALAR(0x169bc90)
print ${test()}; # 3
2018/12/29(土) 10:57:10.93ID:mEoLSW4X
sub test{
return \[1,2,3];
}
$" = ',';
print "@${test()}\n";

use Data::Dumper;
print Dumper(test());
2018/12/29(土) 11:13:23.47ID:Q3TbjvxP
#これが基本
@array = (1, 2, 3);
print "@array", "\n";

#戻り値にするなら
sub func1 {
my @array = (1, 2, 3);
return \@array;
}

print "@{func1()}", "\n";

#無名の場合
sub func2 {
return [1, 2, 3];
}

print "@{func2()}", "\n";
2018/12/29(土) 11:19:02.45ID:UbMSpY+5
>>789 レスどうもです。

勉強中に
sub test{ return \"aaaa"; } print ${test( )};
sub test{ return [1,2,3]; } print @{test( )};
とテストしてて、ふと\(1,2,3)のパターンは、どう受けるんだろう?と悩んでます。
リストだとオート変数で消えるのかな?とか、
リスト→スカラー変数で最後の3しか受けれないのかな?などと考える程度で、さっぱり仕様がわかってません。

あと、
my $data="aaaaa";
my $test= $data=~ tr/a/b/;
print $test;
これもイケそうでイケなかったので悩んでます。

----と書いてるところでログ更新したら790を見ました。
2018/12/29(土) 11:24:43.16ID:UbMSpY+5
なるほど、これはダメですね。
print Dumper($data=~ tr/a/b/); #5
2018/12/29(土) 11:40:12.74ID:JLECNNE+
>>791
リストをスカラー評価すると、そのリストの要素数になる。
こういうときにまぎらわしいので、(10,20,30)とかオススメ。
2018/12/29(土) 11:45:55.56ID:UbMSpY+5
いまテストしてました。
>>793 なるほど

sub test1{
return \(11,22,33);
}
sub test2{
return \[11,22,33];
}

use Data::Dumper;
print Dumper(test1());
$VAR1 = \11;
$VAR2 = \22;
$VAR3 = \33;

print Dumper(test2());
$VAR1 = \[ 11, 22, 33 ];

ここまで確認しましたが、test1の11を表示する方法がわかりません。
よろしくお願いします。
2018/12/29(土) 11:56:22.23ID:JY4FTrNS
リファレンスが何を表しているのか理解しよう

$var = 11;
$ref = \$var;

say $var
say \$var;
say $ref;
say $$ref;
say ${$ref};
2018/12/29(土) 12:30:51.49ID:UbMSpY+5
下記の test2() は動きます。
でもこれだと@aと@bの@が目印程度の意味しかないのかな?と思ってしまいます。

sub test1{
return (11,22,33);
}
sub test2{
return \(11,22,33);
}

use Data::Dumper;
print Dumper(test1());
print Dumper(test2());

@a=test1();
print $a[0]; # 11

@b=test2();
print ${$b[0]}; # 11
2018/12/29(土) 12:33:10.04ID:UbMSpY+5
上が動くのに、下が動きません。

@b=test2();
print ${$b[0]}; # 11

print ${test2()[0]}; #動きません
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況